Ako nájsť násobiteľ x, ak x * c1 = c2, ale x * c1 spôsobuje pretečenia

0

Otázka

Píšem kód, ktorý nájdete zrážok pre std::hash<std::string> a snaží zvrátiť niektoré hash výpočet krokov.

Tam je taká násobenie v std::hash implementáciu.

size_t hash2 = shift_mix(hash1) * mul;

Viem, hash2 - z predchádzajúceho kroku, aj ja viem mul - je to konštantná hodnota = 0xc6a4a7935bd1e995UL.

shift_mix(hash1) * mul spôsobuje pretečenia (hash2 / mul = 0), tak to trvá len posledných 64 bitov násobenie výsledok.

Takže, potrebujem spôsob, ako nájsť mnoho variantov shift_mix(hash1) ktoré spĺňajú rovnosť. Aký je najlepší spôsob, ako to urobiť? Pravdepodobne nejako použitie __int128_t?

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

Najlepšiu odpoveď

2

Násobenie podľa nepárny počet modulo napájania dvoch je invertible, takže môžete "späť" to perfektne, bez viaceré možnosti zobrazovať. Avšak, rozdelenie nefunguje po balenie, musíte vynásobiť multiplicative inverzie mul mod 264, ktorý je 0x5f7a0ea7e59b19bd v tomto prípade. 0x5f7a0ea7e59b19bd * 0xc6a4a7935bd1e995 = 1.

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

V iných jazykoch

Táto stránka je v iných jazykoch

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