使用带有Sha1的microtime()(产生唯一的哈希)

时间:2012-08-06 09:32:48

标签: php sha1

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

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

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

你会说什么?

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

5 个答案:

答案 0 :(得分:2)

你能保证唯一性吗? SHA1产生160位散列。 2^160可以获得超过microtime个可能的值。因此,将存在多个生成相同散列的值。哈希值将随机分布在所有意图和目的中,因此即使在相对较短的时间间隔内也可能发生冲突。

你能否在实践中承担独特性?好吧,因为没有保证,所以这都是概率性的。它没有帮助强制执行最小间隔 - 任何两个观察之间哈希冲突的概率是相同的。但概率非常低,所以你可能没问题。取决于如果你得到一个世界将会结束,或者如果你只是轻微的不方便......;)

答案 1 :(得分:2)

使用uniqid()您无需创建自己的

答案 2 :(得分:2)

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

话虽如此,散列字符串的大小越长,碰撞就越不可能。

你也可以使用GUID或uniqid这样的东西,但问题是同样的:有可能发生碰撞。极不可能,但可能。

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

如果您只是想要看起来复杂的东西(但实际上并非如此),那么......好吧,为什么?但我想如果你已经死定了,那就尝试做一些事情,例如将唯一ID填入你的哈希值,例如:

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

或:

$sha1 = sha1(rand().microtime());
$hash = substr($sha1,0,20). '-'.$id.'-'. substr($sha1,21);

答案 3 :(得分:1)

您可以使用UUID(如本页上的评论所示:http://php.net/manual/en/function.uniqid.php)但是上面的UUID不是这样的,您不能只是假设它是唯一的而插入。

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

答案 4 :(得分:0)

你可以确定.....它的独特性并使db中的列唯一确保...以便你可以重新抛出...并且$ rand()不能相同总是和microtime()

一样