可以md5唯一标识一亿个字符串

时间:2013-02-14 07:03:38

标签: md5

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

3 个答案:

答案 0 :(得分:3)

如果MD5沿2 ^ 128空间均匀分布其结果(它没有,但它非常接近),你可以计算出大小 n 的集合中两个值的可能性。 em> 发生碰撞。这通常被称为'the birthday problem'

有些数学可能看起来很混乱,所以我会尽可能地解释它。

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

n 为此范围内的随机数量(您说100,000,000)

我们可以用下式计算p,即至少一次碰撞的概率:

Equation

使用您提供的值:

Equation

感谢Dukeling提供上述等式1.46E-23的答案,该0.0000000000000000000000146来自{{1}}。您可以阅读有关公式here的更多信息。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果您担心恶意构建冲突字符串的攻击者,则无法使用MD5。如果这不是问题,MD5很可能足以满足您的应用,在实际使用情况下的典型故障率大约为每百万年一次意外碰撞。

但是,我建议选择更可靠的东西,这样你就不用担心了。如果没有别的,你将永远不得不捍卫你使用MD5的决定,因为它已经“知道了”。

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

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