模拟整数溢出的最佳性能方式?

Best performing way to emulate integer overflow?

我正在研究散列函数,移植一些经典函数,如 murmur 或 fnv 系列,并创建我自己的函数,真的很有趣。我知道 js 并不是一个理想的环境,但无论如何。

我 运行 遇到的最大障碍是 js 在大多数算术中使用双精度数。我见过的几乎每一个散列函数都通过乘法来利用整数溢出。例如,我将 7 的输入乘以一些像 0x5bd1e995 这样的大素数,这个乘法将那个小输入的重要性放大到结果的每一位,这对于哈希函数来说非常整洁。

不幸的是,当使用双精度数进行数学计算时,这完全是平的,因为双精度数不会像整数那样溢出(保留最低有效位),而是试图保留结果的大小(保留最高有效位),并且螺丝钉几乎可以设计任何哈希函数。

我找到的几种处理方法是

  1. 在乘法之前对输入求模以确保结果不超过 Number.MAX_SAFE_INTEGER
  2. 将输入拆分为两个 16 位值并重新组合后进行乘法运算
  3. 根据输入使用各种幻数以确保我保持在双精度整数范围内

但问题是,其中 none 速度很快,并且会降低性能。那么,提问时间:在乘法几乎肯定会超过 Number.MAX_SAFE_INTEGER 的情况下,是否有一种性能良好的方法来模拟 js 中的整数溢出行为?

请查看Math.imul

这会将数字乘以 32 位整数并简单地截断溢出位。