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

查看:101
本文介绍了javascript - 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);
}

解决方案

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

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

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

这篇关于javascript - immutablejs源码中这个计算数字哈希的函数的怎么理解?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆