Mi rendo conto che questo è vecchio, ma ho pensato di contribuire con la mia soluzione. Ci sono 2 ^ 128 possibili combinazioni di hash. E quindi una probabilità 2 ^ 64 di un paradosso del compleanno. Sebbene la soluzione di seguito non eliminerà la possibilità di collisioni, ridurrà sicuramente il rischio di una quantità molto sostanziale.
2^64 = 18,446,744,073,709,500,000 possible combinations
Quello che ho fatto è mettere insieme alcuni hash in base alla stringa di input per ottenere una stringa risultante molto più lunga che consideri il tuo hash ...
Quindi il mio pseudo-codice per questo è:
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
Cioè all'improbabilità pratica di una collisione. Ma se vuoi essere super paranoico e non puoi farlo accadere, e lo spazio di archiviazione non è un problema (né i cicli di elaborazione) ...
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
& Hash(Reverse(SpellOutLengthWithWords(Length(string))))
& Hash(Rotate13(string)) Hash(Hash(string)) & Hash(Reverse(Hash(string)))
Ok, non è la soluzione più pulita, ma questo ora ti fa giocare molto di più con la frequenza con cui incapperai in una collisione. Al punto potrei presumere l'impossibilità in tutti i sensi realistici del termine.
Per amor mio, penso che la possibilità di una collisione sia abbastanza rara da considerarla non "sicura", ma così improbabile che si adatti alle necessità.
Ora le possibili combinazioni aumentano notevolmente. Anche se potresti dedicare molto tempo a quante combinazioni questo potrebbe ottenere, dirò in teoria che ti atterra SIGNIFICATIVAMENTE più del numero citato sopra di
2^64 (or 18,446,744,073,709,551,616)
Probabilmente di un centinaio di cifre in più. Il massimo teorico che questo potrebbe darti sarebbe
Possibile numero di stringhe risultanti:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336