1

嗨,我正在我的 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()是独一无二的吗?

谢谢....

4

3 回答 3

4

A. 你的 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
于 2012-09-26T12:44:52.410 回答
3

MD5 在您的情况下足够独特。

但:

在放弃它之前,我使用了这个技术一段时间。为什么?

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

  2. 如果您需要删除或更新特定键,例如在您的情况下,如果用户想要更改他的位置并且您希望尽快反映此更改,则必须重建相同的数据库查询,对其进行哈希处理, 检索您的密钥。

我更喜欢的解决方案:

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

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

您根本不需要散列,它会更清晰,更容易管理密钥。

于 2012-09-26T12:47:26.637 回答
0

您指的是 MD5 的碰撞漏洞。对于实用、简单的使用,您可以忘记这些。所以 MD5( uniqid() ) 是唯一的。见http://php.net/manual/en/function.uniqid.php

对于生成像 SessionID 这样的使用中的哈希,MD5() 很好。

于 2012-09-26T12:49:37.507 回答