Каков общий наилучший метод 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, когда равно равно также и на этом.
Мой вопрос: это хорошая общая стратегия?
Я вижу, что вычисления на лету могут быть не самыми быстрыми. Возможно, вы захотите пересчитать хеш-код всякий раз, когда значение составного ключа было изменено (например, вызовите метод rehash () из каждого установщика, работающего со свойством ключа.
Предложения и улучшения приветствуются. Нет ли общеизвестных стратегий для этого? Узор?