Object.GetHashCode Méthode
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Sert de fonction de hachage par défaut.
public:
virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Retours
Code de hachage pour l’objet actuel.
Remarques
Pour plus d’informations sur cette API, consultez les remarques d’API supplémentaires pour Object.GetHashCode.
Notes pour les héritiers
Une fonction de hachage est utilisée pour générer rapidement un nombre (code de hachage) qui correspond à la valeur d’un objet. Les fonctions de hachage sont généralement spécifiques à chaque type et, pour unicité, doivent utiliser au moins un des champs d’instance comme entrée. Les codes de hachage ne doivent pas être calculés à l’aide des valeurs des champs statiques.
Pour les classes dérivées de Object, la GetHashCode méthode peut déléguer à l’implémentation de classe GetHashCode() de base uniquement si la classe dérivée définit l’égalité pour être l’égalité de référence. L’implémentation par défaut des types référence GetHashCode() retourne un code de hachage équivalent à celui retourné par la GetHashCode(Object) méthode. Vous pouvez remplacer GetHashCode() les types de référence immuables. En général, pour les types de référence mutables, vous devez remplacer GetHashCode() uniquement si :
Vous pouvez calculer le code de hachage à partir de champs qui ne sont pas mutables ; Ou
Vous pouvez vous assurer que le code de hachage d’un objet mutable ne change pas pendant que l’objet est contenu dans une collection qui s’appuie sur son code de hachage.
Sinon, vous pouvez penser que l’objet mutable est perdu dans la table de hachage. Si vous choisissez de remplacer GetHashCode() un type de référence mutable, votre documentation doit indiquer clairement que les utilisateurs de votre type ne doivent pas modifier les valeurs d’objet pendant que l’objet est stocké dans une table de hachage.
Pour les types valeur, GetHashCode() fournit une implémentation de code de hachage par défaut qui utilise la réflexion. Vous devez envisager de la remplacer pour de meilleures performances.
Pour plus d’informations et d’exemples qui calculent les codes de hachage de différentes façons, consultez la section Exemples.
Une fonction de hachage doit avoir les propriétés suivantes :
Si deux objets se comparent comme égaux, la GetHashCode() méthode de chaque objet doit retourner la même valeur. Toutefois, si deux objets ne sont pas comparés comme égaux, les GetHashCode() méthodes des deux objets n’ont pas besoin de retourner des valeurs différentes.
La GetHashCode() méthode d’un objet doit retourner constamment le même code de hachage tant qu’il n’existe aucune modification de l’état de l’objet qui détermine la valeur de retour de la méthode System.Object.Equals de l’objet. Notez que cela est vrai uniquement pour l’exécution actuelle d’une application et qu’un code de hachage différent peut être retourné si l’application est réexécuter.
Pour des performances optimales, une fonction de hachage doit générer une distribution uniforme pour toutes les entrées, y compris l’entrée fortement cluster. Une implication est que les petites modifications apportées à l’état de l’objet doivent entraîner de grandes modifications apportées au code de hachage résultant pour optimiser les performances de table de hachage.
Les fonctions de hachage doivent être peu coûteuses à calculer.
La GetHashCode() méthode ne doit pas lever d’exceptions.
Par exemple, l’implémentation de la GetHashCode() méthode fournie par la String classe retourne des codes de hachage identiques pour les valeurs de chaîne identiques. Par conséquent, deux String objets retournent le même code de hachage s’ils représentent la même valeur de chaîne. En outre, la méthode utilise tous les caractères de la chaîne pour générer une sortie distribuée raisonnablement aléatoirement, même lorsque l’entrée est en cluster dans certaines plages (par exemple, de nombreux utilisateurs peuvent avoir des chaînes qui contiennent uniquement les 128 caractères ASCII inférieurs, même si une chaîne peut contenir l’un des 65 535 caractères Unicode).
Fournir une bonne fonction de hachage sur une classe peut affecter considérablement les performances d’ajout de ces objets à une table de hachage. Dans une table de hachage avec des clés qui fournissent une bonne implémentation d’une fonction de hachage, la recherche d’un élément prend du temps constant (par exemple, une opération O(1). Dans une table de hachage avec une implémentation médiocre d’une fonction de hachage, les performances d’une recherche dépendent du nombre d’éléments dans la table de hachage (par exemple, une opération O(n), où n est le nombre d’éléments dans la table de hachage). Un utilisateur malveillant peut entrer des données qui augmentent le nombre de collisions, ce qui peut dégrader considérablement les performances des applications qui dépendent des tables de hachage, dans les conditions suivantes :
Lorsque les fonctions de hachage produisent des collisions fréquentes.
Lorsqu’une grande proportion d’objets d’une table de hachage produit des codes de hachage qui sont égaux ou environ égaux les uns aux autres.
Lorsque les utilisateurs entrent les données à partir desquelles le code de hachage est calculé.
Les classes dérivées qui remplacent GetHashCode() doivent également être remplacées Equals(Object) pour garantir que deux objets considérés comme égaux ont le même code de hachage ; sinon, le Hashtable type peut ne pas fonctionner correctement.