Javascript 模拟整数溢出的最佳执行方式?

Javascript 模拟整数溢出的最佳执行方式?,javascript,algorithm,integer-overflow,Javascript,Algorithm,Integer Overflow,我在玩弄散列函数,移植一些经典的函数,比如杂音或fnv家族,然后创建我自己的函数,真的很有趣。我知道js并不是一个理想的环境,但无论如何 我遇到的最大障碍是js在大多数算术中都使用双精度。我见过的几乎每一个散列函数都利用乘法的整数溢出。例如,我把7的输入乘以某个大素数,比如0x5bd1e995,这个乘法将这个小输入的重要性放大到结果的每一位,这对于哈希函数来说是非常简洁的 不幸的是,当使用double进行数学运算时,这完全是徒劳的,因为double不会像整数一样溢出(保留最低有效位),而是试图保

我在玩弄散列函数,移植一些经典的函数,比如杂音或fnv家族,然后创建我自己的函数,真的很有趣。我知道js并不是一个理想的环境,但无论如何

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

不幸的是,当使用double进行数学运算时,这完全是徒劳的,因为double不会像整数一样溢出(保留最低有效位),而是试图保留结果的大小(保留最高有效位),这与几乎任何哈希函数的设计都有关系

我找到的几种处理方法是

  • 在相乘之前对输入进行模化,以确保结果不超过Number.MAX\u SAFE\u INTEGER
  • 在将输入拆分为两个16位值并重新组合后执行乘法
  • 根据输入使用各种幻数,以确保我保持在整数的双倍范围内
  • 但问题是,所有这些都不是快速的,而且会将性能降低。所以,提问时间:在乘法几乎肯定会超过整数的情况下,有没有一种性能良好的方法来模拟js中的整数溢出行为。MAX\u SAFE\u integer?

    请仔细研究


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

    您的意思是像c型整数乘法一样吗?它只是在溢出期间截断顶部位并保留较低的32位。如果你想知道的话,看看
    Math.imul
    。我猜在你的可能但很慢的选项列表中是第4个?@HanYolo确实是这样,看看吧@AhmedFasih是的,从技术上讲,BigInt是一个选项,但比其他所有选项加起来都慢。@zero298问题是,只要从键入的数字数组中获取一个值,它就会变成一个普通的JavaScript数字。