将microtime()与Sha1一起使用(以产生唯一的哈希)


Using microtime() with Sha1 (to produce unique hash)

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

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

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

你会说什么?

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

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

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

您也可以使用 GUID 或 uniqid 之类的东西,但这是相同的问题:存在冲突的可能性。 极不可能,但有可能。

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

如果您只是想要看起来很复杂(但实际上并非如此(的东西,那么......嗯,为什么? 但我想如果你对此死板,试着做一些事情,比如把唯一ID塞进你的哈希中,例如:

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

或:

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

使用 uniqid(( 你不需要创建自己的

你能

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

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

您可以使用

UUID(如本页的评论所示:http://php.net/manual/en/function.uniqid.php(,但是上面不是UUID,因此您不能只是假设它是唯一的插入。

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

你可以肯定.....它的独特性,并使数据库中的列独一无二,以确保......这样你就可以重新抛出...和 $rand(( 不能总是和 microtime(( 一样相同