为什么在javascript中直接在代码中使用大数字?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在javascript中直接在代码中使用大数字?相关的知识,希望对你有一定的参考价值。

如果您查看GA(谷歌分析),268435455,2147483647将使用这些数字进行位操作。

AirBnB也使用这些数字和按位运算符:3266489909,2246822507,3864292196。

例)

function n(e, t) {
    return (65535 & e) * t + (((e >>> 16) * t & 65535) << 16) & 4294967295
}

function r(e) {
    for (var t = e.length, r = 3432918353, o = 461845907, i = 0, u = void 0, a = t & -4, c = 0; c < a; c += 4) u = e.charCodeAt(c) | e.charCodeAt(c + 1) << 8 | e.charCodeAt(c + 2) << 16 | e.charCodeAt(c + 3) << 24, u = n(u, r), u = u << 15 | u >>> 17, u = n(u, o), i ^= u, i = i << 13 | i >>> 19, i = 5 * i + 3864292196 | 0;
    switch (u = 0, t % 4) {
        case 3:
            u = e.charCodeAt(a + 2) << 16;
        case 2:
            u |= e.charCodeAt(a + 1) << 8;
        case 1:
            u |= e.charCodeAt(a), u = n(u, r), u = u << 15 | u >>> 17, u = n(u, o), i ^= u
    }
    return i ^= t, i ^= i >>> 16, i = n(i, 2246822507), i ^= i >>> 13, i = n(i, 3266489909), i ^= i >>> 16, i >>> 0
}

我想知道为什么它以这种方式工作。

答案

268435455是一个奇数的复合数。它由六个不同的素数组合而成。它总共有64个除数。

推理因子化为268435455:3×5×29×43×113×127

根据wikipedia,数字2147483647是第八个Mersenne prime,等于2 ^ 31-1。它是仅有的四个已知的double Mersenne primes之一。这是计算中32位带符号二进制整数的最大正值。关于这个数字的好处是,在1867年之前,2,147,483,647仍然是已知最大的素数。

类似地,其他数字在计算中也具有相关意义。

另一答案

前两个数字是bitwise AND masks。 Google Analytics正在尝试从一个数字中提取特定数量的位:

00001111 11111111 11111111 11111111 = 268435455
01111111 11111111 11111111 11111111 = 2147483647
00001111 11100000 00000000 00000000 = 266338304

本质上,它只需要有1位的位 - 它想要忽略0位。 它是域URL哈希码的一部分。


那些其他数字是在散列算法mathematical constants中使用的MurmurHash3。基本上,在哈希函数中使用位旋转和乘法运算时,统计证明它们可以提供最佳结果。

如果它们不是随机选择的(某些常数是),则选择它们以满足某些数学/概率标准。通常通过运行某种模拟来找到这些数字。特别是,这些数字似乎来自Simulated annealing algorithm

另一答案

它似乎是用于指纹的值。

它似乎用于检查完整性。

代码类似于上面的代码。

here

以上是关于为什么在javascript中直接在代码中使用大数字?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中大数相加的解法

#yyds干货盘点#JS两个大数相加

在 SAS 中添加两个大数时,为啥结果是荒谬的?

为什么此代码不适用于大数?

Java中,如何对大数开根号啊!

js怎么用