任意の型 (アトミック型) の複数列の主キーのハッシュ コードを生成するための一般的な衝突のない Java のベスト プラクティスは何ですか?
私はそれについて数時間考え、すべての主キー列で連結された文字列がそうする唯一の信頼できる方法であるという結論に達しました。次に、その連結された文字列で Java の hashCode メソッドを呼び出すと、一意の整数が生成されます。(実際には、データベースのインデックスが行うことを何らかの形で模倣しますが、ここではわかりません)
フォームの複数列の主キーの場合
CREATE TABLE PlayerStats
(
game_id INTEGER,
is_home BOOLEAN,
player_id SMALLINT,
roster_id SMALLINT,
... -- (game_id, is_home) FK to score, (player_id, roster_id) FK to team member
PRIMARY KEY (game_id, is_home, player_id, roster_id)
)
ハッシュコードは次のように計算できます。
@Override
public int hashCode()
{
// maxchars:
String surrogate = String.format("%011d", this.gameId) //11
+ String.format("%01d" , this.isHome ? 1 : 0) //1
+ String.format("%011d", this.playerId) //6
+ String.format("%011d", this.rosterId) //6
System.out.println("surrogate = '" + surrogate + "'");
return surrogate.hashCode();
}
もちろん、equals もこれに基づいている場合、これは HashSets と Hashtable でのみ機能します。
私の質問: これは良い一般的な戦略ですか?
オンザフライ計算が最速ではない可能性があることがわかります。複合キーの値が変更されるたびに、ハッシュ コードを再計算したい場合があります (たとえば、キー プロパティで動作するすべてのセッター内から rehash() メソッドを呼び出します)。
提案と改善を歓迎します。これに対する一般的に知られている戦略はありませんか?パターン?