Cómo encontrar el multiplicador x, si x * c1 = c2, pero x * c1 causas de desbordamiento

0

Pregunta

Estoy escribiendo un código que va a encontrar colisiones para std::hash<std::string> y tratando de revertir algunos de cálculo de hash pasos.

Hay una multiplicación en std::hash aplicación.

size_t hash2 = shift_mix(hash1) * mul;

hash2 - desde el paso anterior, también sé que mul - es el valor de la constante = 0xc6a4a7935bd1e995UL.

shift_mix(hash1) * mul causas de desbordamiento (hash2 / mul = 0), por lo que sólo toma últimos 64 bits resultado de la multiplicación.

Por lo tanto, necesito una manera de encontrar muchas variantes de shift_mix(hash1) que satisfacen la igualdad. ¿Cuál es la mejor manera de hacerlo? Probablemente de alguna manera el uso de __int128_t?

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

Mejor respuesta

2

Multiplicación por un número impar modulo de una potencia de dos es invertible, por lo que se puede "deshacer" a la perfección, sin múltiples opciones que aparecen. Sin embargo, la división no funciona después de envolver, es necesario multiplicar por el inverso multiplicativo de mul mod 264, que es 0x5f7a0ea7e59b19bd en este caso. 0x5f7a0ea7e59b19bd * 0xc6a4a7935bd1e995 = 1.

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

En otros idiomas

Esta página está en otros idiomas

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