10

の出力はObject.hashCode()、同じオブジェクトのすべての JVM 実装で同じである必要がありますか?

たとえば、1.4 で"test".hashCode()返される場合、1.6 で実行さ1れる可能性があります。2または、オペレーティング システムが異なっていたり、インスタンス間のプロセッサ アーキテクチャが異なっていたりするとどうなるでしょうか?

4

6 に答える 6

6

API から

hashCode の一般的な契約は次のとおりです。

  • Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
  • equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。
  • equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。

合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)

于 2009-10-04T16:45:11.073 に答える
0

唯一の真実: アプリケーション実行のハッシュコードは同じです。別の実行により、他のハッシュコードが得られる場合があります。

オブジェクトのハッシュコードを要求すると、JVM は RNG アルゴリズムの 1 つを使用してそれを作成し、将来の使用のためにオブジェクトのヘッダーに配置します。OpenJDK のget_next_hash関数を調べてください。

RNG アルゴリズムは、JVM 引数-XX:hashCode=xで構成できます。x は数字です。

0 – パークミラー RNG (デフォルト)

1 – f (アドレス、グローバル)

2 - 定数 1

3 – 順次カウンター

4 – ヒープ内のオブジェクトのアドレス

5 – Xorshift (最速)

ハッシュコードがヒープ内のアドレスと等しい場合 - GC はオブジェクトを別のヒープ セルなどに移動できるため、これは厄介な場合があります。

于 2015-08-06T17:51:59.930 に答える