Java の String の hashCode() が乗数として 31 を使用するのはなぜですか? 質問する

Java の String の hashCode() が乗数として 31 を使用するのはなぜですか? 質問する

Javaのドキュメントによれば、ハッシュコードオブジェクトの場合はString次のように計算されます。

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

int算術演算を使用します。 は文字列のis[i]番目の文字、は文字列の長さ、は指数を示します。n^

なぜ 31 が乗数として使用されるのですか?

乗数は比較的大きな素数にすべきだと理解しています。では、なぜ 29 や 37、あるいは 97 ではだめなのでしょうか?

ベストアンサー1

ジョシュア・ブロックの効果的な Java、第 2 版(この本はいくらお勧めしても足りないくらいですが、Stack Overflow で何度も言及されていたので購入しました):

31 という値が選ばれたのは、それが奇数の素数だからです。もしこれが偶数で、乗算がオーバーフローすると、2 の乗算はシフトと同じなので、情報が失われます。素数を使用する利点は明確ではありませんが、伝統的です。31 の優れた特性は、乗算をシフトと減算に置き換えてパフォーマンスを向上できることです。31 * i == (i << 5) - i最新の VM は、この種の最適化を自動的に行います。

(第3章、項目9:hashCodeオーバーライドするときは常にオーバーライドするequals、48ページより)

おすすめ記事