Я понимаю, что это старо, но думал, что внесу свое решение. Есть 2 ^ 128 возможных комбинаций хешей. И, таким образом, 2 ^ 64 вероятность парадокса дня рождения. Хотя приведенное ниже решение не исключает возможность столкновений, оно, несомненно, значительно снизит риск.
2^64 = 18,446,744,073,709,500,000 possible combinations
Я сделал несколько хешей на основе входной строки, чтобы получить более длинную результирующую строку, которую вы считаете своим хешем ...
Итак, мой псевдокод для этого:
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
То есть до практической невероятности столкновения. Но если вы хотите быть супер параноиком и не можете этого добиться, и место для хранения не является проблемой (равно как и вычислительные циклы) ...
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
& Hash(Reverse(SpellOutLengthWithWords(Length(string))))
& Hash(Rotate13(string)) Hash(Hash(string)) & Hash(Reverse(Hash(string)))
Ладно, не самое чистое решение, но теперь вы получаете гораздо больше удовольствия от того, как редко вы столкнетесь с столкновением. Кстати, я могу предположить невозможность во всех реалистических смыслах этого термина.
Ради меня, я думаю, что вероятность столкновения достаточно редка, поэтому я буду считать это не "верным", но настолько маловероятным, чтобы это произошло.
Теперь возможные комбинации значительно увеличиваются. Хотя вы могли бы потратить много времени на то, сколько комбинаций вы могли бы получить, я скажу, что теоретически это принесет вам ЗНАЧИТЕЛЬНО больше, чем приведенное выше число
2^64 (or 18,446,744,073,709,551,616)
Вероятно, еще на сто цифр или около того. Теоретический максимум, который это может дать, будет
Возможное количество результирующих строк:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336