2010-07-23 6 views
0

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?

Répondre

0

Le code de hachage est utilisé comme un index pour rechercher des éléments dans l'ensemble de données qui ont le même code.La méthode d'égalité est ensuite utilisée pour trouver des correspondances dans l'ensemble des éléments qui ont le même En tant que tel, le code de hachage généré n'a pas besoin d'être unique à 100%, il doit simplement être "suffisamment unique" pour créer une distribution décente parmi les éléments de données, de sorte qu'il n'est pas nécessaire d'invoquer les mêmes. méthode sur un grand nombre d'éléments avec la même valeur hashCode. De ce point de vue, la génération de beaucoup de chaînes et de codes de hachage sur ces chaînes semble être une manière coûteuse d'éviter une opération égale qui consiste en 3 comparaisons entières et 1 comparaison booléenne. Cela ne garantit pas nécessairement l'unicité de la valeur du code de hachage.

Ma recommandation serait de commencer par une approche simple consistant à faire en sorte que le code de hachage de la clé soit la somme des codes de hachage de ses constituants. Si cela ne fournit pas une bonne distribution, car tous les identifiants sont dans une plage similaire, vous pouvez essayer de multiplier les identifiants par des facteurs différents avant de faire la somme.

Questions connexes