Cette documentation est archivée et n’est pas conservée.

Object.GetHashCode, méthode

Mise à jour : novembre 2007

Sert de fonction de hachage pour un type particulier.

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

public virtual int GetHashCode()
public int GetHashCode()
public function GetHashCode() : int

Valeur de retour

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

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 obtenir de meilleurs résultats, 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 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.

using System;

public struct Int32 {
   public int value;

   //other methods...

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


import System.*;
public class Int32
{
	public int value;

	//other methods...
	public int GetHashCode()
	{
		return value;
	} //GetHashCode
} //Int32


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));
   }
}


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile pour Smartphone, Windows Mobile pour Pocket PC, Xbox 360

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

.NET Framework

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

.NET Compact Framework

Pris en charge dans : 3.5, 2.0, 1.0

XNA Framework

Pris en charge dans : 2.0, 1.0
Afficher: