なぜ素数 31 を使うのですか?
これは2つに分けられますか?
- なんで素数?
ここで、目標はオブジェクトの一意のHashCode を取得することであり、そのオブジェクトを O(1) 時間で見つけるのに役立つことを理解する必要があります。
ここでのキーワードは、一意です。
素数
素数は一意の数です。それらは、素数がそれを構成するために使用されるという事実のために、素数と他の数との積が一意である可能性が最も高いという点で一意です (もちろん、素数自体ほど一意ではありません)。このプロパティは、ハッシュ関数で使用されます。
.
なぜ31番?
効果的な Javaから
項目 9 から: equals をオーバーライドするときは常に hashCode をオーバーライドします。
値 31 が選択されたのは、奇素数だからです。偶数で乗算がオーバーフローした場合、2 による乗算はシフトと同等であるため、情報が失われます。素数を使用する利点はあまり明確ではありませんが、伝統的なものです。
31 の優れた特性は、パフォーマンスを向上させるために、乗算をシフト (§15.19) と減算に置き換えることができることです。
31 * i == (i << 5) - i 最新の VM は、この種の最適化を自動的に行います。
この項目のレシピはかなり優れたハッシュ関数を生成しますが、最先端のハッシュ関数を生成するわけではなく、リリース 1.6 の Java プラットフォーム ライブラリもそのようなハッシュ関数を提供しません。このようなハッシュ関数を記述することは研究テーマであり、数学者や理論計算機科学者に任せるのが最善です。
おそらく、プラットフォームの今後のリリースでは、平均的なプログラマーがそのようなハッシュ関数を構築できるように、そのクラスとユーティリティ メソッドに最先端のハッシュ関数が提供されるでしょう。それまでの間、この項目で説明されている手法は、ほとんどのアプリケーションに適しています。
これは非常に良いソースです。