hashCode() で long を int にマップするにはどうすればいいですか? 質問する

hashCode() で long を int にマップするにはどうすればいいですか? 質問する

longGUID のように、システム全体で特定のオブジェクトを一意に識別する値を持つフィールドを持つオブジェクトの範囲があります。Object.equals()オブジェクトのコピーで動作させたいので、比較にこの ID を使用するように をオーバーライドしました。今度は もオーバーライドしたいと思います。これは基本的に、 を何らかの戻り値にObject.hashCode()マッピングすることを意味します。longint

の目的をhashCode正しく理解していれば、これは主にハッシュ テーブルで使用されるため、均一な分散が望ましいことになります。つまり、単に返すだけでid % 2^32十分です。それだけですか、それとも他に注意すべき点はありますか?

ベストアンサー1

Java 8以降では

Long.hashCode(guid);

古いバージョンの Java の場合は、以下を使用できます。

Long.valueOf(guid).hashCode();

このソリューションではスタックに新しいオブジェクトが作成されますが、最初のソリューションでは作成されないことに注意してください (ただし、Java ではオブジェクトの作成が最適化される可能性があります)。

ドキュメントを見ると、どちらの方法でも次のアルゴリズムが使用されていることがわかります。

(int)(this.longValue()^(this.longValue()>>>32))

これらは Java ライブラリを使用しているため、適切なソリューションです。すでにテスト済みのものを活用する方が常に優れています。

おすすめ記事