immutablejs源码中这个计算数字哈希的函数的怎么理解?

immutablejs源码中这个计算数字哈希的函数的怎么理解?

function hashNum(o) {

var type = typeof o;

  if (type === 'number') {

    if (o !== o || o === Infinity) {

      return 0;

    }

    var h = o | 0;

    if (h !== o) {

      h ^= o * 0xFFFFFFFF;

    }

    while (o > 0xFFFFFFFF) {

      o /= 0xFFFFFFFF;

      h ^= o;

    }

    return smi(h);

  }

}


// v8 has an optimization(优化组合) for storing 31-bit signed numbers(有正负符号数).

// Values which have either 00 or 11 as the high order bits(高字节位) qualify(限定).

// This function drops the highest order bit in a signed number(有正负符号数), maintaining(坚持,保卫)

// the sign bit(符号位).

function smi(i32) {

  return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF);

}


德玛西亚99
浏览 457回答 1
1回答

慕姐8265434

首先明确 hashNum 函数的使用场景。JS 默认采用了 IEEE-754 的 64 位双精度浮点数来存储数字,这使得数字的实际值域很大。hashNum 函数利用了Chrome 对整数类型的优化,将 number 类型的浮点数映射为一个 32 位整数,从而加快比较速度。因此,这个函数实际上是通过位运算的方式将浮点数转为了一个整数。在输入数字是一个不大的整数的条件下,函数返回的是整数本身。对于数字非常大和数字为浮点数的情形下,会返回一个 i32 格式的整数作为哈希结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript