の出力はObject.hashCode()
、同じオブジェクトのすべての JVM 実装で同じである必要がありますか?
たとえば、1.4 で"test".hashCode()
返される場合、1.6 で実行さ1
れる可能性があります。2
または、オペレーティング システムが異なっていたり、インスタンス間のプロセッサ アーキテクチャが異なっていたりするとどうなるでしょうか?
API から
hashCode の一般的な契約は次のとおりです。
合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)
唯一の真実: アプリケーション実行のハッシュコードは同じです。別の実行により、他のハッシュコードが得られる場合があります。
オブジェクトのハッシュコードを要求すると、JVM は RNG アルゴリズムの 1 つを使用してそれを作成し、将来の使用のためにオブジェクトのヘッダーに配置します。OpenJDK のget_next_hash関数を調べてください。
RNG アルゴリズムは、JVM 引数-XX:hashCode=xで構成できます。x は数字です。
0 – パークミラー RNG (デフォルト)
1 – f (アドレス、グローバル)
2 - 定数 1
3 – 順次カウンター
4 – ヒープ内のオブジェクトのアドレス
5 – Xorshift (最速)
ハッシュコードがヒープ内のアドレスと等しい場合 - GC はオブジェクトを別のヒープ セルなどに移動できるため、これは厄介な場合があります。