Предполагая равномерный разброс в диапазоне хэшей 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)
So
P(both) = 2^-128 * 2^-160 = 2^-288 ~= 2.01 x 10^-87
Опять же, если у вас есть пул строк, и вы пытаетесь определить вероятности столкновений с пулом, вы находитесь в области парадокса дня рождения , и эту вероятность я вычислил здесь не относится. Это и хеши не так однородны, как должны быть. В действительности у вас будет гораздо более высокая частота столкновений, но она все равно будет крошечной.
EDIT
Поскольку вы имеете дело с парадоксом дня рождения, примените ту же логику, что и в решении парадокса дня рождения. Давайте посмотрим на это с точки зрения только одной хеш-функции:
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 (примерно 530 миллионов).
P = (2^288!)/(2^288^(2^29) * (2^288 - 2^29)!)
Короче, я даже не хочу думать о расчете этого числа. Я даже не уверен, как вы можете оценить это. Вам по крайней мере понадобится калькулятор произвольной точности, который может обрабатывать огромные факториалы, не умирая.
Обратите внимание, что вероятности будут следовать кривой, которая начинается с 0, когда N = 1 or 2
, и достигает 1, когда N >= 2^288
, по форме похожа на фигуру на странице Википедии для парадокса дня рождения.
Парадокс дня рождения достигает P = .5
, когда N = 23
. Другими словами, вероятность столкновения составляет 50%, когда N составляет 6% от S. Если это масштабируется (я не уверен, что так и будет), это означает, что вероятность столкновения будет 50%, если у вас есть 6% из 2 ^ 288 хешей. 6% от 2 ^ 288 составляет около 2 ^ 284. Ваше значение N (несколько сотен миллионов) близко к этому. Это практически незначительно по сравнению с вашим S, так что я не думаю, что вам есть о чем беспокоиться. Столкновения не очень вероятны.