1
$hash = sha1(rand().microtime());

我打算将 $hash 存储在数据库中。

如果我一次又一次地输入一个字符串,Sha1()它会产生相同的哈希值。但是如果我输入它,它microtime()会返回当前的 Unix 时间戳,以微秒为单位 - 它会保证所有未来调用的哈希值都不同(因为当前时间会增加)。我在这里假设将来的调用是对该函数的调用,在上一次调用之后至少有 1 分钟的差异?

你打算说什么?

我知道我可以通过简单地检查这个哈希是否已经存在于数据库表中来检查唯一性,但我只是想知道在上面使用时我是否可以假设它是唯一的。

4

5 回答 5

3

绝对没有散列函数计算具有预定义的有限长度的字符串可以保证唯一性。任何这样的有限长度字符串都有有限数量的可能输出,但有无限数量的输入。看到任何散列函数都必须处理冲突并不复杂。

话虽如此,散列字符串的大小越长,冲突的可能性就越小。

您也可以使用 GUID 或uniqid之类的东西,但这是同一个问题:可能会发生冲突。极不可能,但有可能。

如果您需要保证唯一的东西,请使用类似AUTO_INCREMENT或其他类型的 ID 来确保唯一性。

如果你只是想要一些看起来很复杂(但实际上并不复杂)的东西,那么......好吧,为什么?但是我想如果您对此一无所知,请尝试将唯一 ID 填充到您的哈希中,例如:

$hash = $id . sha1(rand().microtime());

或者:

$sha1 = sha1(rand().microtime());
$hash = substr($sha1,0,20). '-'.$id.'-'. substr($sha1,21);
于 2012-08-06T09:46:59.277 回答
2

use uniqid() you don't need to create your own

于 2012-08-06T09:37:57.123 回答
2

你能保证唯一性吗?不会。SHA1 产生 160 位散列。有多个2^160可能的值可从microtime. 因此将有多个值生成相同的哈希。哈希值将针对所有意图和目的随机分布,因此即使在相对较小的时间间隔内,您也可能会发生冲突。

你能假设实践中的独特性吗?好吧,既然没有保证,那都是概率性的。强制执行最小间隔无济于事 - 哈希冲突的概率在任何两个观察值之间都是相同的。但是概率很低,所以你可能没事。取决于如果你得到一个世界是否会结束,或者你是否会受到轻微的不便......;)

于 2012-08-06T09:36:52.193 回答
1

您可以使用 UUID(如本页评论所示:http: //php.net/manual/en/function.uniqid.php)但是上面不是 UUID,因此您不能假设它是独特的。

你可以说有十亿分之一的机会发生冲突。如果您取出rand()(因为这实际上可以增加与已经发生的事情相等的可能性time+rand)并且仅在时间上工作,则可以减少这种情况,但这一切都取决于访问,我的意思是MongoId根据时间取 , 但有足够的访问和碎片冲突可能发生并且确实......

于 2012-08-06T09:39:34.983 回答
0

You can be sure.....of its uniqueness and make the column in the db unique to ensure that as well...so that u can rethrow...and $rand() can't be the same always as well as the microtime()

于 2012-08-06T09:38:28.760 回答