を理解するこれらの資質を提示し、なぜどちらも実装者が知らない(うまくいけば、私は遠く離れていた場合、私を修正することができ、ここで同僚)何実際には非常に多くの異なる機能が使用されており、わずかに異なる目的のために、良いハッシュ関数を作ることは難しいです。次のように
Javaのハッシュテーブルは機能:
- 彼らは、そのハッシュコードを生成するために、キーオブジェクトをお願いします。
hashCode()
メソッドの実装は、(最悪の場合、一定の値を返す)明らかに変わりやすい品質の可能性があります。作業する特定のハッシュテーブルにはあまり適合しません。
- 次に、上記の関数を使用してビットを少し上にミックスし、上位ビットにある情報も下位ビットに移動します。これは重要なことです...
- ハッシュコードチェーンの配列にインデックスを取得するために、ハッシュコードのmod(ハッシュテーブル配列エントリの数)をとります。 ハッシュテーブル配列は2の累乗に相当するサイズを持つ可能性があるので、ステップ2のビットをミックスダウンすることは、それらが放棄されないようにするために重要です。
- 次に、等しいキー(
equals()
メソッドに従う)でエントリに到達するまでチェーンをトラバースします。
画像を完成させるために、ハッシュテーブル配列のエントリ数は定数ではありません。チェーンが長すぎる場合、配列は新しい大きな配列に置き換えられ、すべてが再ハッシュされます。これは比較的速く、通常の使用パターン(例えば、put()
のロット、その後にget()
のロットなど)のパフォーマンス上の影響があります。
使用される実際の定数はかなり任意である(そしておそらくInteger
とString
値の多数のようなものを含む、いくつかの単純なコーパスを用いた実験により選択されている)が、その目的はありません:のほとんどに広がっ値全体で情報を得ます値の下位ビットは、可能な限り同様に、hashCode()
の出力に存在するような情報が使用されることを保証する。
(類似の名前にもかかわらず、完全なハッシュまたは暗号化ハッシュでこれを行うわけではありません)前者は、衝突を回避/削減し、後者のニーズ低ビットだけでなく、あらゆる方向に移動する情報。)
重複も回答もありませんが、この記事を見ていると面白いと思うかもしれません:http://stackoverflow.com/questions/2538092/why-does-a-hashmap-rehash-ハッシュコードで提供されるキーオブジェクト –
[奇妙なJavaハッシュ関数を理解する]の可能な複製(http://stackoverflow.com/questions/9335169/understanding-strange-java-hash-function) – jhurtado
あなたはこのサイトでこの質問への回答を得ることはほとんどありません。ダッシュ・リー、ジョシュ・ブロッホ、アーサー・バン・ホフ、ニール・ガーフターといったハッシュマップのデザイナーに聞いてみるとよいでしょう。しかし、私が推測しなければならないのは、これらの数は経験的に決定されたと言うだろう。 – Jeffrey