Javascript 模拟整数溢出的最佳执行方式?
我在玩弄散列函数,移植一些经典的函数,比如杂音或fnv家族,然后创建我自己的函数,真的很有趣。我知道js并不是一个理想的环境,但无论如何 我遇到的最大障碍是js在大多数算术中都使用双精度。我见过的几乎每一个散列函数都利用乘法的整数溢出。例如,我把7的输入乘以某个大素数,比如0x5bd1e995,这个乘法将这个小输入的重要性放大到结果的每一位,这对于哈希函数来说是非常简洁的 不幸的是,当使用double进行数学运算时,这完全是徒劳的,因为double不会像整数一样溢出(保留最低有效位),而是试图保留结果的大小(保留最高有效位),这与几乎任何哈希函数的设计都有关系 我找到的几种处理方法是Javascript 模拟整数溢出的最佳执行方式?,javascript,algorithm,integer-overflow,Javascript,Algorithm,Integer Overflow,我在玩弄散列函数,移植一些经典的函数,比如杂音或fnv家族,然后创建我自己的函数,真的很有趣。我知道js并不是一个理想的环境,但无论如何 我遇到的最大障碍是js在大多数算术中都使用双精度。我见过的几乎每一个散列函数都利用乘法的整数溢出。例如,我把7的输入乘以某个大素数,比如0x5bd1e995,这个乘法将这个小输入的重要性放大到结果的每一位,这对于哈希函数来说是非常简洁的 不幸的是,当使用double进行数学运算时,这完全是徒劳的,因为double不会像整数一样溢出(保留最低有效位),而是试图保
这将数字乘以32位整数,并简单地截断溢出位。您的意思是像c型整数乘法一样吗?它只是在溢出期间截断顶部位并保留较低的32位。如果你想知道的话,看看
Math.imul
。我猜在你的可能但很慢的选项列表中是第4个?@HanYolo确实是这样,看看吧@AhmedFasih是的,从技术上讲,BigInt是一个选项,但比其他所有选项加起来都慢。@zero298问题是,只要从键入的数字数组中获取一个值,它就会变成一个普通的JavaScript数字。