Selon MSDN, une fonction de hachage doit avoir les propriétés suivantes:
Si deux objets sont considérées comme égales, la méthode GetHashCode pour chaque objet doit retourner la même valeur. Toutefois, si deux objets ne sont pas considérées comme égales, la GetHashCode méthodes pour les deux objets n'ont pas à renvoyer des valeurs différentes.
La méthode GetHashCode pour un objet doit constamment revenir par le même code de hachage tant qu'il n'y a pas de modification de l'état de l'objet qui détermine la valeur de retour de l'objet de la méthode Equals. Notez que ceci n'est vrai que pour l'exécution d'une application, et qu'un autre code de hachage peut être retourné si l'application est exécutée à nouveau.
Pour de meilleures performances, une fonction de hachage doit générer une distribution aléatoire pour toutes les entrées.
Je continue de trouver moi-même dans le scénario suivant: j'ai créé une classe, mis en oeuvre IEquatable<T>
et remplacé object.Equals(object)
. MSDN stipule que:
Types de remplacer Égale devez également remplacer GetHashCode ; sinon, la table de hachage peut ne pas fonctionner correctement.
Et puis il s'arrête généralement un peu pour moi. Parce que, comment avez-vous correctement remplacer object.GetHashCode()
? Jamais vraiment savoir par où commencer, et il semble y avoir beaucoup de pièges.
Ici, à StackOverflow, il existe assez peu de questions liées à la GetHashCode primordial, mais la plupart d'entre eux semble être tout à fait particulier des cas et des questions spécifiques. Donc, c'est pourquoi j'aimerais obtenir une bonne compilation ici. Une vue d'ensemble des conseils généraux et des lignes directrices. Quoi faire, quoi ne pas faire, les pièges courants, par où commencer, etc.
Je voudrais qu'il soit surtout C#, mais je pense que cela fonctionnera sorte de la même manière pour les autres .NET langues(?).
Je pense que peut-être la meilleure façon est de créer une seule réponse par question rapide et de réponse à court d'abord (près de one-liner si possible), alors peut-être certains plus d'informations et à la fin avec des questions, des discussions, des articles de blog, etc., si il y a de tout. Je peux alors créer un post que l'on a accepté la réponse (pour l'obtenir sur le dessus) avec une "table des matières". Essayez de le garder court et concis. Et de ne pas les lier à d'autres questions et messages de blog. Essayez de prendre de l'essence et puis plutôt le lien vers la source (surtout depuis la source pourrait disparaître. Aussi, essayez de la modifier et d'améliorer les réponses au lieu de créé beaucoup de produits très similaires.
Je ne suis pas un très bon rédacteur technique, mais je vais au moins essayer de format de réponses afin qu'ils se ressemblent, créer la table des matières, etc. Je vais également essayer de rechercher certaines des questions liées ici à de SORTE que les réponses des parties de ces et peut-être tirer l'essence même de celles que je peux gérer. Mais depuis que je ne suis pas très stable sur ce sujet, je vais essayer de rester à l'écart pour la plupart :p