md5哈希冲突。

时间:2011-07-30 19:59:06

标签: hash md5 collision hash-collision

如果从1到X计数,其中X是第一个与前一个数字发生md5冲突的数字,那么X是多少?

我想知道我是否正在使用md5作为序列号,在我发生碰撞之前,我可以期望能够枚举多少单位。

6 个答案:

答案 0 :(得分:5)

理论上,你可以预期X <2> 64 附近的碰撞。对于输出为 n 位的散列函数,当您累积了大约2个 n / 2 输出时,会出现第一个碰撞(无论您选择输入的方式如何;顺序整数值在这方面没什么特别的。)

当然,MD5已经显示是一个很好的哈希函数。此外,2 n / 2 仅是平均值。那么,你为什么不尝试呢?采用MD5实现,哈希您的序列号,看看是否发生了冲突。基本的MD5实现应该能够每秒散布几百万个值,并且使用合理的硬盘,您可以累积几十亿个输出,对它们进行排序,并查看是否存在冲突。

答案 1 :(得分:2)

我无法回答你的问题,但你要找的是uuid。 UUID序列号对于数百万种产品而言可能是唯一的,但您可能需要检查数据库以减少发生碰撞的微小机会。

答案 2 :(得分:1)

我相信没有人对此进行过一些测试

考虑到如果你有一个简单的增量数字,你不需要哈希它

答案 3 :(得分:1)

据我所知,md5中没有已知的碰撞2 ^ 32(整数的大小)

答案 4 :(得分:0)

这实际上取决于输入的大小。完美的散列函数每个(input_length / hash_length)散列都会发生冲突。 如果您的输入是小的冲突相当不太可能,到目前为止只有一个单块冲突。

答案 5 :(得分:0)

我意识到这是一个老问题,但我偶然发现了它,找到了一个更好的方法,并且认为我会分享它。

你的序数N有一个上界,所以让我们利用它。假设N&lt; 2 32 ≈4.3* 10 10 。现在,每当您需要一个新的标识符时,您只需选择一个随机的32位数字R并将其与R xor N(连接前的零填充)连接。这会生成一个随机查找的唯一64位标识符,您可以用16个十六进制数字表示。

这种方法可以完全防止冲突,因为碰巧具有相同随机组件的两个标识符必然具有不同的xor-ed组件。

奖励功能:您可以将这样的64位标识符拆分为两个32位数字,并将它们相互xor以恢复原始序号。