模拟整数溢出的最佳方法?

问题描述

我正在沉迷于散列函数,移植一些诸如杂音或fnv系列之类的经典之作,并真正创造自己的乐趣。我知道js并不是一个理想的环境,但是无论如何。

我遇到的最大障碍是,js在大多数算术运算中都使用了double。我见过的几乎每个哈希函数都通过乘法来利用整数溢出。例如,我将7的输入乘以0x5bd1e995之类的大质数,该乘积将小输入的重要性放大到结果的每一位,这对于哈希函数确实很整洁。

不幸的是,当使用double进行数学运算时,这完全落空,因为double不会像整数那样溢出(保留最低有效位),而是尝试保留结果的大小(保留最高有效位),并且用几乎任何哈希函数的设计。

我发现处理此问题的几种方法

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

问题仍然存在,但是这些都不是很快,并且会降低性能。因此,请问时间:在乘法几乎肯定会超过Number.MAX_SAFE_INTEGER的情况下,是否有一种表现良好的方法来模拟js中的整数溢出行为?

解决方法

请查看Math.imul

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