Я усвідомлюю, що це старе, але думав, що внесу своє рішення. Існує 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