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);
}
阅读 2.6k
1 个回答

首先明确 hashNum 函数的使用场景。

JS 默认采用了 IEEE-754 的 64 位双精度浮点数来存储数字,这使得数字的实际值域很大。hashNum 函数利用了
Chrome 对整数类型的优化,将 number 类型的浮点数映射为一个 32 位整数,从而加快比较速度。

因此,这个函数实际上是通过位运算的方式将浮点数转为了一个整数。在输入数字是一个不大的整数的条件下,函数返回的是整数本身。对于数字非常大和数字为浮点数的情形下,会返回一个 i32 格式的整数作为哈希结果。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题