我知道MD5已经发生了一些碰撞,但这更多是有关哈希函数的高级问题。
如果MD5将任意字符串哈希为32位十六进制值,则根据鸽巢原理,这显然不可能是唯一的,因为存在比32位十六进制值更多的唯一任意字符串。
我知道MD5已经发生了一些碰撞,但这更多是有关哈希函数的高级问题。
如果MD5将任意字符串哈希为32位十六进制值,则根据鸽巢原理,这显然不可能是唯一的,因为存在比32位十六进制值更多的唯一任意字符串。
你说得没错,MD5 不能保证唯一性,但是在一个32位十六进制值(16^32)中有大约3.402823669209387e+38种不同的值。这意味着,在算法背后的数学给出良好分布的情况下,发生重复的可能性极小。然而需要记住的是,在考虑如何使用它时,存在重复的可能性。通常使用 MD5 来确定某些东西是否被更改过(例如校验和)。修改某个内容后产生相同的MD5校验和几乎是不可能的。
编辑:(鉴于最近有关SHA1哈希的新闻) 上面的答案仍然是正确的,但您不应期望使用MD5哈希作为任何形式的反篡改安全检查。 SHA-1 哈希碰撞的概率比 MD5 小2^32(超过40亿),并且已经证明可以构造输入以产生相同的值。(在相当长时间之前,这已经针对MD5被证明过)。如果您想确保没有恶意地修改某个内容以产生相同的哈希值,则现在需要使用 SHA-2 来获得可靠的保证。
另一方面,如果不涉及安全检查,MD5 仍然具有其用处。
可以认为,SHA-2 哈希的计算成本足够低,因此您应该无论如何都使用它。
SHA-2
是否也存在与 MD5
相同的问题,并且有可能出现重复结果? - Nabi K.A.Z.您完全正确。但是哈希并不是关于“唯一”的,而是关于“足够唯一的”。
因此,虽然您可能会有误报的匹配,但您不会有误报的未匹配。根据您的应用程序以及对象是否预期始终相等或始终不同,哈希可能是一个多余的步骤。
正如Mike(以及其他人)所说,它并不完美,但它能够完成任务,而碰撞性能实际上取决于算法(实际上相当不错)。
真正有趣的是自动操作文件或数据以保持相同哈希值但具有不同数据的功能,请参见此演示。
正如其他人所回答的那样,哈希函数在定义上不能保证返回唯一值,因为对于无限数量的输入,只有固定数量的哈希。它们的关键特性是它们的碰撞是不可预测的。
换句话说,它们不容易被反转--因此,虽然可能有许多不同的输入会产生相同的哈希结果(“碰撞”),但找到其中任意两个是计算上不可行的。