假设随机字符串在 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)!)
简而言之,我什至不想考虑计算这个数字。我什至不确定你如何去估计它。你至少需要一个任意精度的计算器,它可以处理巨大的阶乘而不会死。
请注意,概率将遵循一条曲线,该曲线从 0 时开始N = 1 or 2
,并且在 1 时达到 1 N >= 2^288
,其形状类似于 Wikipedia 页面上的生日悖论。
生日悖论P = .5
何时达到N = 23
。换句话说,当 N 为 S 的 6% 时,碰撞的概率为 50%。如果按比例缩放(我不确定是否如此),这意味着当你有 50% 的机会发生碰撞时2^288 哈希的 6%。2^288 的 6% 约为 2^284。你的 N 值(几亿)远不及那个值。与你的 S 相比,它实际上微不足道,所以我认为你没有什么可担心的。碰撞的可能性不大。