我理解到有证据表明MD5无法保证唯一性,因为宇宙中的字符串数量比MD5哈希字符串还要多,但是否存在有限数量的字符串的逆证明呢?
基本上,如果我有最大长度为X的字符串,是否存在X使MD5得到保证唯一? 如果是,那么X是多少?如果对于X有多个值,那么X的最大值是多少?
或者对于其他哈希算法,如SHA-1等,是否存在这样的X呢?
我理解到有证据表明MD5无法保证唯一性,因为宇宙中的字符串数量比MD5哈希字符串还要多,但是否存在有限数量的字符串的逆证明呢?
基本上,如果我有最大长度为X的字符串,是否存在X使MD5得到保证唯一? 如果是,那么X是多少?如果对于X有多个值,那么X的最大值是多少?
或者对于其他哈希算法,如SHA-1等,是否存在这样的X呢?
总结以下这里的优秀回答:什么是导致MD5碰撞的最短字符串对?
目前已知攻击MD5的最短字符串需要2个输入块,即128字节或1024位。
对于任何输出N位哈希算法,假设它近似随机地分布输入,则可以假定在约sqrt(2^N)
个输入中发生碰撞的可能性超过50%。例如,MD5哈希为128位,因此您可以预期在所有64位输入之间发生碰撞。这假设哈希是均匀随机的。任何弱点都会减少在预期发生碰撞之前所需的输入数量。
你的问题的答案是肯定的。对于任何哈希函数,都存在一个最大长度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 位哈希,这是 2256。这意味着在实践中,除非哈希函数很糟糕,否则上述程序实际上永远不会终止,但在理论上,这意味着你的数字 X 存在。
希望这可以帮助!