Cette page vous a-t-elle été utile ?
Votre avis sur ce contenu est important. N'hésitez pas à nous faire part de vos commentaires.
Vous avez d'autres commentaires ?
1500 caractères restants
GetHashCode, méthode
Cet article a fait l'objet d'une traduction manuelle. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte.
Traduction
Source

Object.GetHashCode, méthode

Sert de fonction de hachage pour un type particulier.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)

public virtual int GetHashCode()

Valeur de retour

Type : System.Int32
Code de hachage du Object actif.

Un code de hachage est une valeur numérique utilisée pour identifier un objet pendant le test d'égalité. Il peut également servir d'index pour un objet d'une collection.

La méthode GetHashCode peut être utilisée dans des algorithmes de hachage et des structures de données telles qu'une table de hachage.

L'implémentation par défaut de la méthode GetHashCode ne garantit pas des valeurs de retour uniques pour des objets différents. En outre, le .NET Framework ne garantit pas l'implémentation par défaut de la méthode GetHashCode, et la valeur qu'elle retourne sera identique entre les différentes versions du .NET Framework. Par conséquent, l'implémentation par défaut de cette méthode ne doit pas être utilisée en tant qu'identificateur d'objet unique à des fins de hachage.

La méthode GetHashCode peut être substituée par un type dérivé. Les types valeur doivent substituer cette méthode pour fournir une fonction de hachage adaptée à ce type et qui garantit une distribution utile dans une table de hachage. Pour l'unicité, basez le code de hachage sur la valeur d'un champ ou d'une propriété d'instance, et non sur un champ ou une propriété statique.

Les objets utilisés comme clé dans un objet Hashtable doivent également substituer la méthode GetHashCode car ces objets doivent générer leur propre code de hachage. Si un objet utilisé comme clé ne fournit pas une implémentation utile de GetHashCode, vous pouvez spécifier un fournisseur de code de hachage lorsque l'objet Hashtable est construit. Avant le .NET Framework version 2.0, le fournisseur de code de hachage était basé sur l'interface System.Collections.IHashCodeProvider. À partir de la version 2.0, le fournisseur de code de hachage est basé sur l'interface System.Collections.IEqualityComparer.

Remarques à l'attention des implémenteurs

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 propres à chaque Type et, pour des questions d'unicité, doivent utiliser au moins un des champs de l'instance comme entrée.

Une fonction de hachage doit posséder les propriétés suivantes :

  • Si deux objets sont considérés comme égaux, la méthode GetHashCode de chaque objet doit retourner la même valeur. Toutefois, si deux objets ne sont pas considérés comme égaux, les méthodes GetHashCode de deux objets ne doivent pas nécessairement retourner des valeurs différentes.

  • La méthode GetHashCode d'un objet doit constamment retourner le même code de hachage tant qu'aucune modification n'est apportée à l'état de l'objet qui détermine la valeur de retour de la méthode Equals de l'objet. Notez que cela est vrai uniquement pour l'exécution en cours d'une application, et qu'un code de hachage différent peut être retourné si l'application est exécutée à nouveau.

  • Pour obtenir les meilleures performances, une fonction de hachage doit générer une distribution aléatoire pour toutes les entrées.

Par exemple, l'implémentation de la méthode GetHashCode fournie par la classe String retourne des codes de hachage identiques pour des valeurs de chaîne identiques. Par conséquent, deux objets String 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 de manière raisonnablement aléatoire, même si l'entrée est ordonnée en clusters dans certaines plages (par exemple, de nombreux utilisateurs peuvent posséder des chaînes contenant uniquement les 128 caractères ASCII inférieurs, même si une chaîne peut contenir n'importe lesquels des 65 535 caractères Unicode).

Pour les classes dérivées de Object, la méthode GetHashCode peut déléguer à l'implémentation de Object.GetHashCode, si et seulement si cette classe dérivée définit l'égalité des valeurs comme une égalité des références et si le type n'est pas un type valeur.

Si vous fournissez une fonction de hachage adéquate sur une classe, cela peut affecter considérablement les performances lors de l'ajout de ces objets à une table de hachage. Dans une table de hachage possédant une implémentation adéquate d'une fonction de hachage, la recherche d'un élément prend une durée constante (par exemple, une opération O(1)). Dans une table de hachage possédant une mauvaise implémentation d'une fonction de hachage, les performances d'une recherche dépendent du nombre d'éléments contenus dans la table de hachage (par exemple, une opération O(n), où n correspond au nombre d'éléments figurant dans la table de hachage). Les fonctions de hachage doivent également être peu coûteuses à calculer.

Les implémentations de la méthode GetHashCode ne doivent pas entraîner de références circulaires. Par exemple, si ClassA.GetHashCode appelle ClassB.GetHashCode, ClassB.GetHashCode ne doit pas appeler ClassA.GetHashCode directement ou indirectement.

Les implémentations de la méthode GetHashCode ne doivent pas lever d'exception.

Les classes dérivées qui substituent GetHashCode doivent également substituer Equals pour garantir que deux objets considérés comme égaux possèdent le même code de hachage ; sinon, il se peut que le type Hashtable ne fonctionne pas correctement.

Dans certains cas, la méthode GetHashCode est implémentée de manière à retourner simplement une valeur entière. L'exemple de code suivant illustre une implémentation de GetHashCode qui retourne une valeur entière.

Il existe d'autres méthodes plus compliquées pour combiner des codes de hachage qui peuvent donner de meilleures performances pour les tables de hachage.


using System;

public struct Int32 {
   public int value;

   //other methods...

   public override int GetHashCode() {
      return value;
   }
}


Il arrive fréquemment qu'un type possède plusieurs champs de données qui peuvent participer à la génération du code de hachage. Une manière de générer un code de hachage consiste à combiner ces champs à l'aide d'une opération XOR (eXclusive OR), comme le montre l'exemple de code suivant.


using System;

public struct Point {
   public int x;
   public int y; 

   //other methods

   public override int GetHashCode() {
      return x ^ y;
   }
}


L'exemple de code suivant illustre un autre cas, où les champs du type sont combinés à l'aide de XOR (eXclusive OR) pour générer le code de hachage. Remarquez que dans cet exemple de code, les champs représentent des types définis par l'utilisateur, implémentant chacun GetHashCode et Equals.


using System;

public class SomeType {
   public override int GetHashCode() {
     return 0;
   }
}

public class AnotherType {
   public override int GetHashCode() {
     return 1;
   }
}

public class LastType {
   public override int GetHashCode() {
     return 2;
   }
}

public class MyClass {
   SomeType a = new SomeType();
   AnotherType b = new AnotherType();
   LastType c = new LastType();

   public override int GetHashCode () {
     return a.GetHashCode() ^ b.GetHashCode() ^ c.GetHashCode();
   }
}


Si les données membres de la classe dérivée sont supérieures à Int32, vous pouvez combiner les bits de poids fort de la valeur avec les bits de poids faible à l'aide d'une opération XOR (eXclusive OR), comme le montre l'exemple de code suivant.


using System;

public struct Int64 {
   public long value;

   //other methods...

   public override int GetHashCode() {
      return ((int)value ^ (int)(value >> 32));
   }
}


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Pris en charge dans :

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Ajouts de la communauté

AJOUTER
Microsoft réalise une enquête en ligne pour recueillir votre opinion sur le site Web de MSDN. Si vous choisissez d’y participer, cette enquête en ligne vous sera présentée lorsque vous quitterez le site Web de MSDN.

Si vous souhaitez y participer,
Afficher:
© 2015 Microsoft