Eu estou escrevendo um código que vai encontrar colisões para std::hash<std::string>
e para tentar reverter alguns de cálculo de hash passos.
Não há como uma multiplicação em std::hash
implementação.
size_t hash2 = shift_mix(hash1) * mul;
Eu sei hash2
- a partir do passo anterior, também sei mul
- é o valor da constante = 0xc6a4a7935bd1e995UL
.
shift_mix(hash1) * mul
faz com que o estouro (hash2 / mul = 0
), por isso leva apenas a última versão de 64 bits do resultado da multiplicação.
Então, eu preciso de uma maneira de encontrar muitas variantes de shift_mix(hash1)
que satisfazem a igualdade. Qual é a melhor forma de o fazer? Provavelmente de algum modo usar __int128_t
?