1

最近、Javaのメソッドequalsとメソッドをオーバーライドする必要があります。hashCodeしたがって、私はハッシュコードを計算するための高速で効率的な方法を探しました。

Java開発者は、次の方法に同意しているようです。

    int hash = 23;
    hash = hash * 37 + paramOne;
    hash = hash * 37 + paramTwo;
    // And so on...

単純な算術かもしれませんが、私は実際にはわかりません。保証とは何ですか?コーナーケースは何ですか?それを行うためのより良い(かなり単純な)方法はありますか?

ありがとうございました !

4

3 に答える 3

2

それは素因数についてです。この答えを見てください。

高速で実用的な方法を探していて、パフォーマンスに大きな懸念がない場合は、Apache CommonsLangHashCodeBuilderまたは同様のライブラリ関数を参照してください。に相当するビルダーがありequalsます。

于 2012-06-13T09:47:27.763 に答える
2

Joshua Blochの言葉で(クラス のhashCode() メソッドのデフォルトの実装を説明しています:) :Strings[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

奇数の素数であるため、値31が選択されました。それが偶数で乗算がオーバーフローした場合、2による乗算はシフトと同等であるため、情報は失われます。プライムを使用する利点はあまり明確ではありませんが、伝統的です。31の優れた特性は、パフォーマンスを向上させるために、乗算をシフトと減算に置き換えることができることです。31 * i ==(i << 5)-i。最新のVMは、この種の最適化を自動的に実行します。

詳細については、これこれを参照してください。

于 2012-06-13T09:50:05.063 に答える
1

Joshua Blochは、彼の「Effective Java」の第3章で、equalsとhashCodeを適切にオーバーライドする方法を説明しています。それのためにグーグルとそれを読んでください。

彼はコレクションAPIを作成した人物であり、現在はGoogleのチーフJavaアーキテクトです。それは私にとって十分に権威があります。

于 2012-06-13T09:46:58.523 に答える