2017-02-01 32 views
0

如果你看GA(谷歌分析),268435455,2147483647將使用這些數字進行位操作。爲什麼在javascript中直接在你的代碼中使用大數字?

的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 
} 

我想知道爲什麼它以這種方式。

+1

'268435455..toString(2)===「1111111111111111111111111111'' – Ryan

+0

100101 ...沒有在漫長的十進制數的二進制代碼是什麼意思?。? – Integral

+0

'268435455 ===(1 << 28) - 1'。魔術數字在位操作中通常是可以接受的。 – 4castle

回答

0

是一個奇數的複合數字。它由六個不同的素數乘以一起組成。它共有六十四個因子。

的268435455總理因式分解: 3×5×29×43×113×127

根據wikipedia,數是第八Mersenne prime,等於2^31 - 1。這是一個只有四個已知的double Mersenne primes。這是計算中32位有符號二進制整數的最大正值。關於數字的好處在於直到1867年,2,147,483,647仍然是最大的已知素數。

類似地,其他數字在計算中也具有相關意義。

0

它似乎是一個用於指紋印刷的值。

它似乎被用來檢查完整性。

代碼與上面的代碼類似。

here

+0

https://en.wikipedia.org/wiki/MurmurHash>算法 3432918353是0xcc9e2d51, 461845907是0x1b873593, 3864292196是0xe6546b64 – Integral

相關問題