您好我在我的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()是唯一的??
谢谢....
答案 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在您的情况下非常独特。
<强>可是:强>
在放弃之前我使用了这种技术一段时间。的为什么吗
md5被认为对密码散列来说太快了。但它仍然是一个散列函数,每当你必须进行数据库查询时调用它,它可能会减慢你的代码。我在过去看到,哈希SQL查询生成一个密钥负责20%的PHP执行时间,这是巨大的。
如果您需要删除或更新特定密钥,例如,如果用户想要更改其位置并希望尽快反映此更改,则必须重建相同的数据库查询,哈希,以检索您的密钥。
我更喜欢的解决方案:
创建简单,简短,有用的密钥。通常,使用模型中的方法名称。如果您的示例中的方法是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()没问题。