2010-05-22 6 views

Répondre

34

Le minimum requis est que le code de hachage soit le même pour toute valeur donnée. Ainsi, cette mise en œuvre fonctionne, mais la distribution est horrible:

public override int GetHashCode() { 
    return 1; 
} 

Pour mieux, les codes de hachage doit tenir compte de toutes les données pertinentes dans l'objet et être aussi égaux que possible dans la plage entière.

Une implémentation qui prend en compte tous les membres mais ne donne pas une très bonne distribution peut être trouvée dans la structure System.Drawing.Point. Il utilise XOR pour combiner les bits dans les éléments, ce qui signifie que tous les points où X et Y sont égaux obtenir le code de hachage zéro:

public override int GetHashCode() { 
    return this.X^this.Y; 
} 

Une manière d'obtenir une meilleure répartition consiste à multiplier un membre par un premier nombre et ajouter le membre suivant, répéter au besoin:

public override int GetHashCode() { 
    return ((this.Value1 * 251) + this.Value2) * 251 + this.Value3; 
} 

la même méthode a été utilisée dans de simples générateurs aléatoires, comme il éparpille les valeurs assez bien.

+0

Quelques très bons points là-bas. Merci! – dotnetdev