Java哈希表中的哈希

问题描述 投票:2回答:1

我一直在研究哈希表源代码。并发现哈希如何发生:

int index = (hash & 0x7FFFFFFF) % tab.length;

我不明白为什么在这里使用按位AND?

如果将0x7FFFFFFF转换为二进制,则得到= 111 1111 1111 1111 1111 1111 11111111‬

据我所知,如果第一位和第二位= 1,则将给出1因此,如果我们得到一些对象哈希码,例如2314539,将其转换为二进制并执行操作,我们实际上得到的是相同的数字:

2314539 = 10 0011 0101 0001 0010 1011

10 0011 0101 0001 0010 1011
&
 11 1111 1111 1111 1111 1111‬
=
 10 0011 0101 0001 0010 1011

10 0011 0101 0001 0010 1011 = 2314539

您可以看到此操作没有进行任何更改。那这里有什么意义?

java hash hashtable
1个回答
0
投票

让我们从%的含义开始。根据JLS 15.17.3

对于二进制二进制数提升后的整数(第5.6.2节)的操作数的余数运算会产生结果值,使得(a/b)*b+(a%b)等于a

根据该规则,余数运算的结果仅在股息为负时才可以是负的,而在股息为正时才可以是正的。此外,结果的大小始终小于除数的大小。

假设索引被计算为index = hash % tab.length。如果是这样,则hash的负值将导致index的负值。

但是我们将使用index下标tab,因此它必须位于0tab.length之间。

因此,实际计算通过屏蔽符号位将hash映射为非负数。

© www.soinside.com 2019 - 2024. All rights reserved.