哈希娱乐 行业新闻 党建先锋

Sumkors Blog哈希游戏

发布时间:2026-01-05 13:54:25  浏览:

  哈希游戏作为一种新兴的区块链应用,它巧妙地结合了加密技术与娱乐,为玩家提供了全新的体验。万达哈希平台凭借其独特的彩票玩法和创新的哈希算法,公平公正-方便快捷!万达哈希,哈希游戏平台,哈希娱乐,哈希游戏

Sumkors Blog哈希游戏

  为什么扩容时使用 e.hash & oldCap 来计算扩容后的数组索引?

  本文通过推导 HashMap 中的取模和扩容公式以回答上述问题。1. 按位与(&)运算的理解

  两个二进制的数按位与,如 A & B,当 B 中某一位为 1,则保留 A 上对应位上的数。

  理解了按位与的这一层含义之后,再来看 HashMap 中的取模和扩容算法。

  而被移掉的部分(低 n 位),则是 e.hash % 2n,也就是余数。

  已知 2n的二进制形式为 1 后面跟着 n 个 0,则 2n- 1 的二进制形式为 n 个 1。

  其实 -7 mod 4 得到 -3 或 1 都是正确的结果。取决于计算机采用的运算规则。

  考虑这样一个计算题:18 除以 5,要得到一个整数结果,究竟应该是 3 还是 4?这就是一个问题了。计算机上有几种对于结果取整的方法:

  取模运算实际上是计算两数相除以后的余数。假设 q 是 a、b 相除产生的商(quotient),r 是相应的余数(remainder),那么在几乎所有的计算系统中,都满足:

  因此 r 有两个选择,一个为正,一个为负;相应的,q 也有两个选择。如果a、b 都是正数的话,那么一般的编程语言中,r 为正数;如果 a、b 都是负数的话,一般 r 为负数。但是如果 a、b 一正一负的话,不同的语言则会根据除法的不同结果而使得 r 的结果也不同,但是一般 r 的计算方法都会满足:

  当 e.hash & oldCap == 0,则节点在新数组中的索引值与旧索引值相同。

  当 e.hash & oldCap != 0,则节点在新数组中的索引值为旧索引值+旧数组容量。

  设:扩容前,节点 e 在旧数组索引值为 x;扩容后,节点 e 在新数组的索引值为 y.

  此时低 n + 1 位的值与低 n 位的值是相等的,即 y = x,命题得证。

  对于一个二进制数,其第 n + 1 位为 1,其余 n 位为 0,该二进制数的值为 2 的 n 次幂,也就是 oldCap。

  推导可知,当 HashMap 容量 capacity 大小是 2 的 n 次幂时,取模公式和扩容公式都可以用按位与运算来替换取模运算,极大地提升了运算效率。

  但是,按位与运算实际是取 hash 值的低位,舍弃了高位会使得 hash 运算结果不均匀。HashMap 通过引入扰动运算,让高位充分参与 hash 运算来避免这个问题。