Java の String hashCode() の謎: なぜ乗数が 31 なのか?
Java の文字列に対する hashCode() メソッドは、文字列の基本的な側面です。データ構造での効率的な保存と取得。特定の式で文字列の文字を組み合わせると、文字列の一意の ID を表す整数が生成されます。ただし、この式で乗数 31 を選択すると、疑問が生じます。
なぜ乗数として 31 を使うのですか?
Java のドキュメントでは、比較的大きな素数を次のように指定する必要があると示しています。ハッシュの衝突を回避し、均一な分散を実現するための乗数として使用されます。しかし、なぜ 31 ではなく 29、37、または 97 ではないのでしょうか?
理由 1: 奇数素数
Joshua Bloch の「Effective Java」によると、31 の選択はこれは奇数素数であることに由来します。偶数を使用すると、乗算がオーバーフローした場合に情報が失われる可能性があります。2 で乗算することはシフトと同等であるためです。
理由 2: パフォーマンスの最適化
31 の興味深い特性つまり、乗算はシフトと減算で効率的に置き換えることができます: 31 * i == (i
素数の重要性
あまり明らかではありませんが、素数の使用はというメリットもあります。素数は値をより均等に分散するため、素数以外の乗数と比較してハッシュ衝突の可能性が低くなります。これにより、一意の文字列を区別し、一貫した検索パフォーマンスを維持する機能が強化されます。
したがって、Java の String hashCode() メソッドの乗数 31 は任意の選択ではなく、最適化、効率、および衝突回避の結果です。プロパティを設定し、文字列オブジェクトの識別と管理に効果的な値となります。
以上がJava の「String.hashCode()」が乗数として 31 を使用するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。