为什么在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。
它似乎是用于指纹的值。
它似乎用于检查完整性。
代码类似于上面的代码。
以上是关于为什么在javascript中直接在代码中使用大数字?的主要内容,如果未能解决你的问题,请参考以下文章