web-dev-qa-db-ja.com

Java(hash&0x7FFFFFFF)%tab.lengthを使用してキーのインデックスを決定するのはなぜですか?

以下のリンクから、Javaは(hash & 0x7FFFFFFF) % tab.lengthを使用して、{key、value}を配置する配列のスロットを決定します。

http://grepcode.com/file/repository.grepcode.com/Java/root/jdk/openjdk/7-b147/Java/util/Hashtable.Java#Hashtable.put%28Java.lang.Object% 2Cjava.lang.Object%29

私の質問は、なぜJava最初にハッシュと0x7FFFFFFFを実行するのですか?特定の目的はありますか?

26
Jackson Tale

なぜなら-1 % 10 == -1配列へのインデックス作成には絶対に必要ありません。符号ビットを0に強制すると、この問題を回避できます。

31
Voo

理由:

  • 0x7FFFFFFFは01111111 1111 1111 1111 1111 1111 1111:符号ビットを除くすべて1です。

  • (hash & 0x7FFFFFFF)は正の整数になります。

  • (hash & 0x7FFFFFFF) % tab.lengthはタブの長さの範囲になります。

36
sinsedrix

Hashtableは多かれ少なかれ古く、HashMapに置き換えられていることに注意してください。これはhash & (table.length-1)を使用して同じ目的を達成します。

ご覧のとおり、前にビットシフトも行います ここ 。これは、多様性の低い数値を返すhashCode()メソッドの不適切な実装に対処するためです。

4
Philipp Wendler