【问题标题】:How to find multiplier x if x * c1 = c2, but x * c1 causes overflow如果x * c1 = c2,如何找到乘数x,但x * c1会导致溢出
【发布时间】:2022-01-02 07:03:31
【问题描述】:

我正在编写一个代码来查找std::hash<std::string> 的冲突,并尝试反转一些哈希计算步骤。

std::hash 实现中有这样的乘法。

size_t hash2 = shift_mix(hash1) * mul;

我知道hash2 - 从上一步,我也知道mul - 它是常数值 = 0xc6a4a7935bd1e995UL

shift_mix(hash1) * mul 导致溢出(hash2 / mul = 0),所以只取最后 64 位的乘法结果。

所以,我需要一种方法来找到满足相等性的shift_mix(hash1) 的许多变体。最好的方法是什么?可能以某种方式使用__int128_t

【问题讨论】:

    标签: c++ hash stdhash


    【解决方案1】:

    奇数模乘以 2 的幂是可逆的,因此您可以完美地“撤消”它,而不会出现多个选项。但是,换行后除法不起作用,您需要乘以 mul mod 264 的乘法逆元,在这种情况下为 0x5f7a0ea7e59b19bd。 0x5f7a0ea7e59b19bd * 0xc6a4a7935bd1e995 = 1.

    uint64_t mul_inv = 0x5f7a0ea7e59b19bd;
    uint64_t hash1 = unshift_mix(hash2 * mul_inv);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-11
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多