Javaのハッシュテーブルにハッシング

Skyglar:

私は、ハッシュテーブルのソースコードに掘ってきました。そして、ハッシュが発生したかが見つかりました:

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

ビット単位のANDここで使用される理由を私は理解していませんか?

我々はバイナリに0x7FFFFFFFで電源を入れた場合、我々は= 111 1111 1111 1111 1111 1111 1111 1111を取得します

私はビット単位を知り、与えるとして1を最初の桁と第二IF = 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

あなたが見ることができるように、この操作は、変更を加えることはありません。だから、ここでのポイントは何ですか?

スティーブンC:

私たちは、残りの意味(を見てみましょう%Javaで)。よると、JLS 15.17.3

バイナリ数値昇格(5.6.2)の後に整数であるオペランドを剰余演算は、その結果の値は、生成(a/b)*b+(a%b)に等しいですa

これは、剰余演算の結果は、被除数が負である場合にのみ負であることができ、被除数が正である場合にのみ陽性であることができることは、この規則に従います。また、結果の大きさは常に除数の大きさよりも小さいです。

仮定しindexて計算しましたindex = hash % tab.lengthそれがそうであった場合、負の値hash(被除数)は負の値をもたらしますindex

しかし、我々は、使用しようとしているindex添字にtabそれが間になければならないので、0tab.length

代わりに、実際の計算は、マップhash符号ビットをマスキングすることにより、第1の非負の数に。それは剰余演算を行います。

だから、ここでのポイントは何ですか?

  1. あなたの働いていた例では、正のためだったhash値。&負のための違い作るんhash値を。
  2. ポイントはマイナス避けるためであるhash負与える値indexにつながる価値をArrayIndexOutOfBoundsException

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=468026&siteId=1