假设随机字符串的MD5和SHA-1哈希值在范围内均匀分布(实际情况并非如此),并且我们只讨论两个字符串而不是一组字符串(因此避免了生日悖论类型的复杂性):
MD5哈希值宽度为128位,SHA-1的哈希值宽度为160位。根据上述假设,如果两个字符串A和B的哈希值相同,则它们发生碰撞的概率为P。
P(both collide) = P(MD5 collides) * P(SHA-1 collides)
并且
P(MD5 collides) = 1/(2^128)
P(SHA-1 collides) = 1/(2^160)
所以
P(both) = 2^-128 * 2^-160 = 2^-288 ~= 2.01 x 10^-87
如果您有一组字符串,并且正在尝试确定与该组的碰撞概率,则处于
生日悖论的领域,我在此计算的概率不适用。此外,哈希值并不像它们应该那样均匀。实际上,您将拥有更高的碰撞率,但仍将非常小。
编辑
由于您正在处理生日悖论的情况,因此应用与解决生日悖论的解决方案相同的逻辑。让我们从一个哈希函数的角度来看待它:
N := the number of hashes in your pool (several hundred million)
S := the size of your hash space (2^288)
Therefore,
P(There are no collisions) = (S!)/(S^N * (S - N)!)
假设我们有一个漂亮的偶数哈希值,例如2^29(大约5.3亿)。
P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)
简而言之,我甚至不想考虑计算这个数字。我甚至不确定如何估计它。你至少需要一个可以处理巨大阶乘的任意精度计算器。
请注意,当N = 1或2时,概率将呈近乎0的曲线开始,并且当N >= 2^288时,它将达到1,形状类似于维基百科生日悖论页面上的曲线。
生日悖论在N = 23时达到P = .5。换句话说,当N是S的6%时,碰撞的概率为50%。如果可以按比例缩放(我不确定是否可以),这意味着当你有2^288个哈希的6%时,会有50%的碰撞几率。你的N值(几亿)远远不及此。与S相比,它几乎微不足道,因此我认为你没有什么可担心的。碰撞的可能性不太高。