2012-09-03 3 views
10

これらの定数の意味とその理由を説明できる人はいますか?java.util.hashのハッシュコード値を計算する際に使用される定数の説明

static int hash(int h) { 
     // This function ensures that hashCodes that differ only by 
     // constant multiples at each bit position have a bounded 
     // number of collisions (approximately 8 at default load factor). 
     h ^= (h >>> 20)^(h >>> 12); 
     return h^(h >>> 7)^(h >>> 4); 
    } 

ソース:javaの-SE6ライブラリ

+1

重複も回答もありませんが、この記事を見ていると面白いと思うかもしれません:http://stackoverflow.com/questions/2538092/why-does-a-hashmap-rehash-ハッシュコードで提供されるキーオブジェクト –

+4

[奇妙なJavaハッシュ関数を理解する]の可能な複製(http://stackoverflow.com/questions/9335169/understanding-strange-java-hash-function) – jhurtado

+0

あなたはこのサイトでこの質問への回答を得ることはほとんどありません。ダッシュ・リー、ジョシュ・ブロッホ、アーサー・バン・ホフ、ニール・ガーフターといったハッシュマップのデザイナーに聞いてみるとよいでしょう。しかし、私が推測しなければならないのは、これらの数は経験的に決定されたと言うだろう。 – Jeffrey

答えて

0

私はまた、このような "マジック" の数字について疑問に思っています。私の知る限り、のマジックナンバーです。
奇数と素数には、ハッシュ(プライマリ/セカンダリクラスタリングなどを避ける)で使用できる興味深い優先順位があることが広範なテストによって証明されています。
私は、ほとんどの数字が、統計的に良い分布を与えることが証明された研究とテストの後に来ると信じています。 特にこれらの数字は、私はわかりませんが、私は印象を持っていることを行うのはなぜこれら特定番号が

2

を理解するこれらの資質を提示し、なぜどちらも実装者が知らない(うまくいけば、私は遠く離れていた場合、私を修正することができ、ここで同僚)何実際には非常に多くの異なる機能が使用されており、わずかに異なる目的のために、良いハッシュ関数を作ることは難しいです。次のように

Javaのハッシュテーブルは機能:

  1. 彼らは、そのハッシュコードを生成するために、キーオブジェクトをお願いします。 hashCode()メソッドの実装は、(最悪の場合、一定の値を返す)明らかに変わりやすい品質の可能性があります。作業する特定のハッシュテーブルにはあま​​り適合しません。
  2. 次に、上記の関数を使用してビットを少し上にミックスし、上位ビットにある情報も下位ビットに移動します。これは重要なことです...
  3. ハッシュコードチェーンの配列にインデックスを取得するために、ハッシュコードのmod(ハッシュテーブル配列エントリの数)をとります。 ハッシュテーブル配列は2の累乗に相当するサイズを持つ可能性があるので、ステップ2のビットをミックスダウンすることは、それらが放棄されないようにするために重要です。
  4. 次に、等しいキー(equals()メソッドに従う)でエントリに到達するまでチェーンをトラバースします。

画像を完成させるために、ハッシュテーブル配列のエントリ数は定数ではありません。チェーンが長すぎる場合、配列は新しい大きな配列に置き換えられ、すべてが再ハッシュされます。これは比較的速く、通常の使用パターン(例えば、put()のロット、その後にget()のロットなど)のパフォーマンス上の影響があります。

使用される実際の定数はかなり任意である(そしておそらくIntegerString値の多数のようなものを含む、いくつかの単純なコーパスを用いた実験により選択されている)が、その目的はありません:のほとんどに広がっ値全体で情報を得ます値の下位ビットは、可能な限り同様に、hashCode()の出力に存在するような情報が使用されることを保証する。

(類似の名前にもかかわらず、完全なハッシュまたは暗号化ハッシュでこれを行うわけではありません)前者は、衝突を回避/削減し、後者のニーズ低ビットだけでなく、あらゆる方向に移動する情報。)

関連する問題