Am scris un cod care va găsi coliziuni pentru std::hash<std::string>
și încercarea de a inversa unele dintre hash etape de calcul.
Există astfel o multiplicare în std::hash
punerea în aplicare.
size_t hash2 = shift_mix(hash1) * mul;
Stiu hash2
- de la pasul anterior, de asemenea, știu mul
- e o valoare constantă = 0xc6a4a7935bd1e995UL
.
shift_mix(hash1) * mul
cauzele de preaplin (hash2 / mul = 0
), deci este nevoie de doar ultimii 64 de biți de multiplicare rezultat.
Deci, am nevoie de o modalitate de a găsi mai multe variante de shift_mix(hash1)
care satisface egalitatea. Ceea ce este cel mai bun mod de a face asta? Probabil folosesc cumva __int128_t
?