嗨,我在我的代码点火器应用程序中集成了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()是独一无二的吗?
谢谢..。
发布于 2012-09-26 12:44:52
答:您的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值。这意味着,假设算法背后的数学给出了一个很好的分布,你的概率会非常小,会有一个重复。
更好的选择是使用sha1
$betterKey = "user" . sha1(strtolower($sql));
^- identify request for each table发布于 2012-09-26 12:47:26
在您的情况下,MD5是非常独特的。
但:
我在放弃它之前用了一段时间。为什么?
我喜欢的解决方案:
用简单的、短的、有用的键代替。通常,使用模型中的方法名。如果示例中的方法是User::getUser($name, $location),则使用键:
$key = "User::getUser($name, $location)"您根本不需要散列,它将更清晰,更容易管理密钥。
发布于 2012-09-26 12:49:37
你指的是碰撞漏洞 of MD5。为了实用,简单的使用,你可以忘记那些。因此,MD5( uniqid() )是唯一的。请参阅http://php.net/manual/en/function.uniqid.php
对于生成使用中的散列(如SessionID ),MD5()很好。
https://stackoverflow.com/questions/12601928
复制相似问题