ランダムな文字列に対してMD5およびSHA-1ハッシュの範囲で均一に広がると仮定し(そうではありません)、文字列のプールについてではなく2つの文字列についてのみ話していると仮定します(したがって、誕生日のパラドックスを回避します) -タイプの複雑さ):
MD5ハッシュは128ビット幅で、SHA-1は160です。上記の仮定では、2つの文字列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
繰り返しますが、文字列のプールがあり、プールとの衝突の確率を決定しようとしている場合、あなたは誕生日のパラドックスの領域にあり、ここで計算したこの確率は適用されません。それとハッシュは、本来あるべきほど均一ではありません。実際には、衝突率ははるかに高くなりますが、それでも小さいでしょう。
編集
誕生日のパラドックスの状況を扱っているので、誕生日のパラドックスの解決策と同じロジックを適用します。1つのハッシュ関数の観点から見てみましょう。
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億3000万)のような偶数のハッシュがあるとしましょう。
P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)
要するに、私はこの数を計算することさえ考えたくありません。どうやって見積もってもいいのかわからない。少なくとも、死ぬことなく巨大な階乗を処理できる任意精度の計算機が必要です。
確率は、の場合はほぼ0から始まり、の場合N = 1 or 2
は1に達する曲線に従うことに注意してください。これN >= 2^288
は、誕生日のパラドックスのWikipediaページにあるものと同様の形状です。
誕生日のパラドックスはP = .5
いつになりますかN = 23
。つまり、NがSの6%の場合、衝突の確率は50%です。それがスケーリングする場合(そうなるかどうかはわかりません)、次の場合に衝突の確率は50%になることを意味します。 2 ^ 288ハッシュの6%。2 ^ 288の6%は約2^284です。N(数億)の値はそれに近いものではありません。あなたのSと比べるとほとんど意味がないので、心配することはないと思います。衝突の可能性はほとんどありません。