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);}
1 回答

慕姐8265434
TA贡献1813条经验 获得超2个赞
首先明确 hashNum 函数的使用场景。
JS 默认采用了 IEEE-754 的 64 位双精度浮点数来存储数字,这使得数字的实际值域很大。hashNum 函数利用了
Chrome 对整数类型的优化,将 number 类型的浮点数映射为一个 32 位整数,从而加快比较速度。
因此,这个函数实际上是通过位运算的方式将浮点数转为了一个整数。在输入数字是一个不大的整数的条件下,函数返回的是整数本身。对于数字非常大和数字为浮点数的情形下,会返回一个 i32 格式的整数作为哈希结果。
添加回答
举报
0/150
提交
取消