2

在 Java 的 HashMap 实现中,在计算了 key 对象的哈希值之后,我猜想在其上使用函数 hash(int hashvalue) 来进一步随机化生成的哈希值。当它进行右移时,它会更多地随机化 LSB 位。他们为什么不通过执行左移来随机化 MSB?

而不是做喜欢

  • h ^= (h >>> 20) ^ (h >>> 12); // 这里从右边第 21 位开始的位不变 // 考虑输入的哈希值在 (2^21) -(2^22) 范围内的情况,这些值将分布在桶中(2^21) -(2^22) 的索引和散列图中的剩余存储桶未使用。

  • 返回 h ^ (h >>> 7) ^ (h >>> 4); // 更加随机化 LSB 部分。

为什么他们不能做类似的事情

  • h ^= (h >>> 20) ^ (h >>> 12) ^ (h <<< 20) ^ (h <<< 12); // 这会随机化 LSB 位和 MSB 位

  • 返回 h ^ (h >>> 7) ^ (h >>> 4) ^ (h <<< 7) ^ (h <<< 4);

结果,我们将得到一个具有随机 MSB 和 LSB 位的随机数。

4

0 回答 0