Sei que isso é antigo, mas pensei em contribuir com minha solução. Existem 2 ^ 128 combinações de hash possíveis. E, portanto, uma probabilidade de 2 ^ 64 de um paradoxo de aniversário. Embora a solução abaixo não elimine a possibilidade de colisões, ela certamente reduzirá o risco em uma quantidade muito significativa.
2^64 = 18,446,744,073,709,500,000 possible combinations
O que fiz foi juntar alguns hashes com base na string de entrada para obter uma string resultante muito mais longa que você considera seu hash ...
Portanto, meu pseudocódigo para isso é:
Result = Hash(string) & Hash(Reverse(string)) & Hash(Length(string))
Isso é a improbabilidade prática de uma colisão. Mas se você quer ser superparanóico e não pode deixar que isso aconteça, e espaço de armazenamento não é um problema (nem os ciclos de computação) ...
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, não é a solução mais limpa, mas agora você pode brincar muito mais com a infrequência de colidir. Até o ponto, posso assumir a impossibilidade em todos os sentidos realistas do termo.
Para o meu bem, acho que a possibilidade de uma colisão é rara o suficiente para que eu não considere isso "infalível", mas é tão improvável de acontecer que se adapta à necessidade.
Agora, as combinações possíveis aumentam significativamente. Embora você possa gastar muito tempo pensando em quantas combinações isso pode lhe render, eu direi que, em teoria, você ganha SIGNIFICAMENTE mais do que o número citado acima de
2^64 (or 18,446,744,073,709,551,616)
Provavelmente por mais cem dígitos ou mais. O máximo teórico que isso poderia dar a você seria
Número possível de strings resultantes:
528294531135665246352339784916516606518847326036121522127960709026673902556724859474417255887657187894674394993257128678882347559502685537250538978462939576908386683999005084168731517676426441053024232908211188404148028292751561738838396898767036476489538580897737998336