2017-09-06 19 views
-1

我有关于md5函数的唯一性的问题。md5的一部分有多独特?

我知道MD5(与microtime中值)不是唯一的,但是,他们是相当独特的:)

我如何计算MD5散列值的两个部分之间发生碰撞的概率是多少?

例如:在PHP生成从MD5结果的8个字符的字符串以下:

substr(md5(microtime()), 0, 8); 

第二种情况 - 如果它的索引是唯一的(因此它的散列的不同部分每一次)?

substr(md5(microtime()), rand(0, 32), 8); 
+3

这是干什么用的?如果你想要一个随机字符串,有更好的方法。 –

+0

绝对。我意识到这不是产生独特字符串的方式。它只是出于好奇 –

回答

0

当您询问字符串的唯一性时,它实际上是一个概率。意味着你将使用尽可能多的字符串字符,并且尽可能多的随机字符串的长度会减少获得类似随机字符串的机会。

因此,要获得唯一的字符串,你需要存储字符串中的数据块,并随机字符串比较,如果你发现了类似的然后新的新鲜串又来了,直到你得到唯一的字符串。

+0

谢谢,你是对的。然而,我很好奇这些概率,而不是关于如何创建一个更好的算法。我说了8个字符长度的字符串的2场景.. –

0

这取决于你要多少“子哈希”生成和你有多少位从原来的MD5哈希(“子散”的长度)一致。如果只生成1个子哈希并保留1位,则根本不会发生冲突。如果您生成2个子哈希会有50%的冲突。使用2位,赔率为25%。你做数学。参阅生日悖论更多信息

1

有8个十六进制数字2^32个组合。即使它们是完全随机的,平均而言,只能生成约65000个这样的字符串,然后才能得到2个相同的字符串。

MD5(),使用随机指数与否,并不显著只要改变任何东西,因为所有microtime中()值使用用途是唯一的。但是,如果您生成的速度太快,或者跨越多台机器,则情况会更糟糕,因为您很可能最终会使用相同的microtime()值两次。