1

给定数亿个平均长度为几百个的唯一字符串,md5 可以唯一地代表它们中的每一个吗?会发生碰撞吗?安全性不是问题,但唯一性是问题。

4

3 回答 3

4

如果 MD5 沿 2^128 空间均匀分布其结果(它没有,但非常接近),您可以计算大小为n的集合中两个值发生碰撞的几率。这通常被称为“生日问题”

其中一些数学可能看起来令人困惑,所以我会尽可能地解释它。

M为 MD5 范围的大小(2^128,因为 MD5 是 128 位散列函数)

n是这个范围内的随机值的数量(你说 100,000,000)

我们可以计算 p,即至少发生一次碰撞的概率,其中:

方程

使用您提供的值:

方程

感谢Dukeling提供了上述等式的答案,1.46E-23得到0.0000000000000000000000146您可以在此处阅读有关公式的更多信息。

于 2013-02-14T07:56:20.207 回答
1

对于任何类型的散列函数,例如 MD5,存在 2 个散列到相同值的字符串。因此,给定任何一组唯一字符串,除非您深入分析它们或将它们全部散列,否则您不能确定其中 2 个不会散列到相同的值。

于 2013-02-14T07:09:25.373 回答
1

如果您担心攻击者恶意构造冲突字符串,则不能使用 MD5。如果这不是问题,MD5 很可能足以满足您的应用程序,在实际用例中的典型故障率约为每百万年发生一次意外碰撞。

但是,我建议选择更可靠的东西,这样您就不必担心了。如果不出意外,您将始终必须捍卫您使用 MD5 的决定,因为它“已知已损坏”。

例如,您可以使用MD160获取 160 位散列,使用 SHA-1 获取 168 位散列,或使用 SHA-256 获取 256 位散列。尽管努力试图找到它们,但所有这些算法都没有已知的冲突。意外碰撞的可能性比小行星撞击失败的可能性小数十亿倍。

最佳选择取决于您的优先事项。碰撞的后果是什么?你必须抵抗恶意攻击吗?性能有多重要?哈希大小有多重要?给我们一些更多的细节,我们可以给你更好的建议。

于 2013-02-14T07:23:33.163 回答