php memcache密钥管理

时间:2012-09-26 12:39:57

标签: php codeigniter memcached

您好我在我的codeigniter应用程序中集成了memcache, 我的查询更改了用户选择的值。像这样的事情

$sql='select * from user where user_name="'.$name.'" and location='".$location."'";
$result = $this->memcached_library->get(md5($sql));
if(!$result ){
       /*  execute query and get $result    */
       $this->memcached_library->add(md5($sql), $result );
}else{
       return $result;
}

这是我处理每个不同查询的密钥的方法。但我听说过一些md5()并不总是唯一的。

1> md5()始终是唯一的吗?

2 - ;如果md5()不是唯一的选择......

3>怎么样的 crc32()是唯一的??

谢谢....

3 个答案:

答案 0 :(得分:4)

一个。你的SQL错误应该是

 $sql = "select * from user where user_name = '{$name}' and location = '{$location}'";

B中。您的代码可能有错误,因为MD5区分大小写

var_dump(md5("A"),md5("a"));

输出

string '7fc56270e7a70fa81a5935b72eacbe29' (length=32)
string '0cc175b9c0f1b6a831c399e269772661' (length=32)

使用strtolower

更好地接近我们
  $result = $this->memcached_library->get(md5(strtolower($sql)));

C,MD5是否唯一

  

MD5不能保证总的唯一性,但在32位十六进制值(16 ^ 32)中大约有3.402823669209387e + 38个不同的值。这意味着,假设算法背后的数学分布很好,那么你的几率就会非常小,而且会有重复。

d。更好的选择是使用sha1

$betterKey = "user" .  sha1(strtolower($sql));
               ^- identify request for each table

答案 1 :(得分:3)

MD5在您的情况下非常独特。

<强>可是:

在放弃之前我使用了这种技术一段时间。的为什么吗

  1. md5被认为对密码散列来说太快了。但它仍然是一个散列函数,每当你必须进行数据库查询时调用它,它可能会减慢你的代码。我在过去看到,哈希SQL查询生成一个密钥负责20%的PHP执行时间,这是巨大的。

  2. 如果您需要删除或更新特定密钥,例如,如果用户想要更改其位置并希望尽快反映此更改,则必须重建相同的数据库查询,哈希,以检索您的密钥。

  3. 我更喜欢的解决方案:

    创建简单,简短,有用的密钥。通常,使用模型中的方法名称。如果您的示例中的方法是User::getUser($name, $location),请填写您的密钥:

    $key = "User::getUser($name, $location)"
    

    根本不需要哈希,它会更清晰,更容易管理密钥。

答案 2 :(得分:0)

您正在参考MD5的Collision vulnerabilities。对于实用,简单的使用,您可以忘记这些。所以MD5(uniqid())是独一无二的。见http://php.net/manual/en/function.uniqid.php

为了生成像SessionID一样使用的哈希值,MD5()没问题。