Cum de a găsi de multiplicare x dacă x * c1 = c2, dar x * c1 cauze preaplin

0

Problema

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?

c++ hash stdhash
2021-11-23 19:31:15
1

Cel mai bun răspuns

2

Înmulțirea cu un număr impar modulo o putere a lui doi este inversabilă, astfel încât să puteți "anula" perfect, fara mai multe opțiuni care apar. Cu toate acestea, divizia nu funcționează după ambalaj, trebuie să se înmulțește cu inversul multiplicativ mul mod 264, care este 0x5f7a0ea7e59b19bd în acest caz. 0x5f7a0ea7e59b19bd * 0xc6a4a7935bd1e995 = 1.

uint64_t mul_inv = 0x5f7a0ea7e59b19bd;
uint64_t hash1 = unshift_mix(hash2 * mul_inv);
2021-11-23 19:41:58

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................