Qu'est-ce qu'une meilleure pratique Java générale sans collision pour générer des codes de hachage pour des clés primaires multi-colonnes de type quelconque (types atomiques)?Hibernate: Stratégie/modèle pour le mappage d'identité d'objet et d'entité à l'aide de clés composites?
J'ai réfléchi pendant quelques heures et je suis arrivé à la conclusion qu'une chaîne concaténée par toutes les colonnes de clé primaire serait la seule façon fiable de le faire. Ensuite, l'appel de la méthode hashCode de Java sur cette chaîne concaténée devrait produire un entier unique. (Il serait en fait imiter en quelque sorte ce que l'indice de base de données ne, pas sûr ici que)
Pour une clé primaire à plusieurs colonnes du formulaire
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)
)
un code de hachage peut être calculée comme:
@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();
}
Bien sûr, cela ne fonctionne qu'avec HashSets et Hashtable lorsque égal est également basé sur cela.
Ma question: est-ce une bonne stratégie générale?
Je peux voir le calcul à la volée peut-être pas le plus rapide. Vous pouvez recalculer le code de hachage chaque fois qu'une valeur de clé composite a été modifiée (par exemple, appelez une méthode rehash() à partir de chaque setter fonctionnant sur une propriété de clé
Suggestions et améliorations sont les bienvenues. pour ce? Un modèle?