Zdaję sobie sprawę, że to stare, ale pomyślałem, że wniesie do mnie moje rozwiązanie. Istnieje 2 ^ 128 możliwych kombinacji skrótów. A zatem prawdopodobieństwo wystąpienia paradoksu urodzin wynosi 2 ^ 64. O ile poniższe rozwiązanie nie wyeliminuje możliwości kolizji, to z pewnością znacznie zmniejszy to ryzyko.
2^64 = 18,446,744,073,709,500,000 possible combinations
To, co zrobiłem, to zestawienie kilku skrótów na podstawie ciągu wejściowego, aby uzyskać znacznie dłuższy ciąg wynikowy, który uważasz za swój hash ...
Więc mój pseudokod do tego to:
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
Oznacza to praktyczne nieprawdopodobieństwo zderzenia. Ale jeśli chcesz być super paranoikiem i nie możesz tego zrobić, a przestrzeń dyskowa nie jest problemem (ani cykle obliczeniowe) ...
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
& Hash(Reverse(SpellOutLengthWithWords(Length(string))))
& Hash(Rotate13(string)) Hash(Hash(string)) & Hash(Reverse(Hash(string)))
Okej, nie jest to najczystsze rozwiązanie, ale teraz dużo więcej bawisz się tym, jak rzadko zderzasz się z kolizją. Do tego stopnia, że mogę założyć niemożliwość we wszystkich realistycznych znaczeniach tego terminu.
Ze względu na mnie myślę, że możliwość kolizji jest na tyle rzadka, że uznam to za nie „pewne”, ale tak mało prawdopodobne, że będzie to odpowiadało potrzebom.
Teraz liczba możliwych kombinacji znacznie wzrasta. Chociaż mógłbyś spędzić dużo czasu na tym, ile kombinacji to może ci dać, powiem teoretycznie, że daje ci to ZNACZĄCO więcej niż cytowana powyżej liczba
2^64 (or 18,446,744,073,709,551,616)
Prawdopodobnie o sto cyfr więcej. Teoretyczne maksimum, jakie mogłoby to dać, byłoby
Możliwa liczba wynikowych ciągów:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336