2009-07-02 7 views
0

Par rapport à cette question (Efficient hashCode() implementation) J'ai une autre question.Mise en œuvre du code de hachage

J'ai une classe "value" dont les instances sont conservées dans une base de données. Ainsi, les instances de cette classe ont toutes un identifiant unique. En conséquence, j'ai implémenté la méthode du code de hachage (et la méthode equals associée) simplement en retournant cet identifiant.

Lorsque vous utilisez le générateur Eclipse hashcode et dire Eclipse à utiliser uniquement l'attribut d'identification pour la génération J'ai la méthode suivante:

@Override 
    public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + id; 
      return result; 
    } 

Je pense id simplement le retour est plus efficace car je sais que cet ID est unique. Ai-je raison ?

Merci à l'avance

+0

Si le résultat est 1, pourquoi multipliez-vous par résultat. Votre fonction est effectivement "return 31 + id". – Tom

+0

Ce qui d'ailleurs, vous pourriez aussi bien se débarrasser du 31, car il ne modifie pas la distribution de l'ID. En bref, le hashcode que vous avez implémenté ne fait rien de spécial, et vous devriez simplement retourner id. Cela étant dit, je ne suis pas sûr de ce qui serait «mieux». – Tom

Répondre

5

Ce n'est pas l'unicité de l'ID qui fait que c'est la bonne chose à faire - c'est le fait que c'est utilisé pour la vérification d'égalité et c'est le seulement utilisé pour la vérification d'égalité.

La version standard d'Eclipse n'est vraiment pertinente que si vous utilisez plusieurs champs pour l'égalité.

+0

+1 pour souligner que c'est * non * unicité :-). Bien dit. – Tom

3

Si vous visez l'unicité de l'identité alors absolument, oui. Gardez à l'esprit que puisque vous ne distribuez (probablement) pas de façon aléatoire vos valeurs via la plage possible de votre fonction de hachage (toutes les valeurs de int), cette performance peut poser un problème pour tout code reposant sur des hachages être réparti uniformément.

P.s. Ce "probablement" vient de mon hypothèse que ces ints uniques sont probablement des valeurs d'identité dans votre DB. Si elles sont vraiment distribuées au hasard, ignorez ma mise en garde.

+0

oui c'est mon but bien sûr. Merci –

+1

java.util.HashMap applique déjà une fonction de hachage supplémentaire au hashcode pour améliorer la distribution, donc la distribution ne devrait pas poser de problème. –

+0

Bon à savoir, mais HashMap n'est pas le seul code à utiliser hashCode(), donc la distribution pourrait poser problème. – GaryF