如何解决模拟整数溢出的最佳方法?
我正在沉迷于散列函数,移植一些诸如杂音或fnv系列之类的经典之作,并真正创造自己的乐趣。我知道js并不是一个理想的环境,但是无论如何。
我遇到的最大障碍是,js在大多数算术运算中都使用了double。我见过的几乎每个哈希函数都通过乘法来利用整数溢出。例如,我将7的输入乘以0x5bd1e995之类的大质数,该乘积将小输入的重要性放大到结果的每一位,这对于哈希函数确实很整洁。
不幸的是,当使用double进行数学运算时,这完全落空,因为double不会像整数那样溢出(保留最低有效位),而是尝试保留结果的大小(保留最高有效位),并且用几乎任何哈希函数的设计。
我发现处理此问题的几种方法是
- 在乘法之前对输入进行模运算,以确保结果不超过Number.MAX_SAFE_INTEGER
- 将输入分为两个16位值并重新组合后进行乘法
- 根据输入使用各种幻数,以确保我停留在整数的双精度范围内
问题仍然存在,但是这些都不是很快,并且会降低性能。因此,请问时间:在乘法几乎肯定会超过Number.MAX_SAFE_INTEGER的情况下,是否有一种表现良好的方法来模拟js中的整数溢出行为?
解决方法
请查看Math.imul。
这会将数字乘以32位整数,并简单地截断溢出位。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。