为任何类型(原子类型)多列主键生成哈希码的一般无冲突 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();
}
当然,这仅适用于 HashSets 和 Hashtable 当 equals 也基于此。
我的问题:这是一个好的总体策略吗?
我可以看到即时计算可能不是最快的。您可能希望在复合键值更改时重新计算哈希码(例如,从每个对键属性进行操作的 setter 中调用 rehash() 方法。
欢迎提出建议和改进。没有任何众所周知的策略吗?一种模式?