所以我理解有证据表明MD5不能保证唯一性,因为宇宙中的字符串多于MD5哈希字符串,但是对于有限数量的字符串是否有任何反证明?
基本上,如果我有最大长度为X的字符串,是否有一个X保证MD5是唯一的?如果是,那那X是什么?如果X的值不止一个,那么X的最大值是什么?
或者是否存在任何其他散列算法,SHA-1等的X?
答案 0 :(得分:2)
总结这里的优秀答案:What's the shortest pair of strings that causes an MD5 collision?
对MD5的最短已知攻击需要2个输入块,即128字节或1024位。
对于输出N位的任何散列算法,假设它大致随机地分配输入,您可以假设大约sqrt(2^N)
输入中的碰撞可能超过50%。例如,MD5哈希值为128位,因此您可以预期所有64位输入之间发生冲突。这假设均匀随机散列。任何弱点都会减少预期发生碰撞之前的输入数量。
答案 1 :(得分:1)
你的问题的答案是肯定的。对于任何散列函数,都有一个最大长度X,您将获得唯一的字符串。但是,找到X可能会非常困难。我们的想法是运行这个程序:
X= 0;
For i = 0 onward
For all strings of length i
Compute the hash code of that string.
If a collision is found, return X.
X = i
我们的想法是只列出更长和更长的字符串,直到找到哈希冲突。最终你必须这样做,因为最终你会产生比可能的哈希输出更多的字符串。
在期望中,假设散列函数实际上非常随机,您需要在发现碰撞之前生成O(√U)不同的字符串,其中U是散列函数映射到的空间的大小。对于256位哈希,这是2 256 。这意味着在实践中上述程序永远不会实际终止,除非哈希函数被破坏,但理论上它意味着你的数字X存在。
希望这有帮助!