私は Java の HashMap hash() 実装を行っていました。以下のようなものです。
final int hash(Object k) {
// some checks
h ^= k.hashCode();
// 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);
// >>> is Unsigned right shift
}
以下のコードが追加された理由がわかりませんが、同じことによってどのような利点が得られるのでしょうか?
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
または、上記のコードを実装から削除した場合、質問を再構成させてください。欠点は何ですか? 衝突の可能性を回避する方法をいくつか理解していますが、「正確に」どのように回避しているのかわかりませんか?
例を挙げて理解を助け、上記のコードの有無にかかわらずどのように機能するかを説明できますか?