Sto scrivendo un codice che si trova collisioni per std::hash<std::string>
e cercando di invertire alcuni di calcolo dell'hash passi.
C'è una moltiplicazione in std::hash
implementazione.
size_t hash2 = shift_mix(hash1) * mul;
So hash2
- dal passo precedente, anche so mul
- è un valore costante = 0xc6a4a7935bd1e995UL
.
shift_mix(hash1) * mul
cause di overflow (hash2 / mul = 0
), quindi ci vuole solo ultimi 64 bit del risultato della moltiplicazione.
Così, ho bisogno di un modo per trovare molte varianti di shift_mix(hash1)
in grado di soddisfare l'uguaglianza. Qual è il modo migliore per farlo? Probabilmente in qualche modo utilizzare __int128_t
?