Java 1.6 APIによって提供されるHashMapクラスのコードを読んでいますが、次の操作の必要性を完全に理解できません(putメソッドとgetメソッドの本体にあります)。
int hash = hash(key.hashCode());
ここで、メソッドhash()
の本体は次のとおりです。
private static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
これにより、提供されたハッシュコードに対してビット演算を実行することにより、ハッシュが効果的に再計算されます。APIに次のように記載されていても、そうする必要があることを理解できません。
HashMapは2の累乗の長さのハッシュテーブルを使用するため、これは重要です。そうしないと、下位ビットで異ならないhashCodeの衝突が発生します。
Key Value Parsがデータ構造の配列に格納されていること、およびこの配列内のアイテムのインデックス位置がそのハッシュによって決定されることを理解しています。私が理解できないのは、この関数がハッシュ分布にどのように値を追加するかということです。