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

Object.GetHashCode, méthode

Sert de fonction de hachage pour un type particulier. GetHashCode est aproprié à une utilisation dans des algorithmes de hachage et des structures de données telles qu'une table de hachage.

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

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

Valeur de retour

Code de hachage pour le Object en cours.

Cette méthode peut être substituée par une classe dérivée. Les classes de valeurs doivent substituer cette méthode pour fournir une fonction de hachage adaptée à la classe et qui garantit une meilleure distribution dans la table de hachage. Les classes qui peuvent être utilisées comme clés dans une table de hachage doivent également substituer cette méthode, car les objets qui sont utilisés comme clés dans une table de hachage sont requis pour générer leur propre code de hachage à l'aide de cette méthode. Toutefois, si les objets utilisés comme clés ne fournissent pas une implémentation utile de GetHashCode, vous pouvez fournir un autre fournisseur de code de hachage, basé sur l'interface System.Collections.IHashCodeProvider, lors de la construction de Hashtable.

L'implémentation par défaut de GetHashCode ne garantit ni son unicité ni sa cohérence ; par conséquent, vous ne devez pas l'utiliser en tant qu'identificateur d'objet unique à des fins de hachage. Les classes dérivées doivent substituer la méthode GetHashCode à l'aide d'une implémentation qui retourne un code de hachage unique. 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.

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 du même type représentent la même valeur, la fonction de hachage doit retourner la même valeur constante pour chaque objet.

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

  • La fonction de hachage doit retourner exactement la même valeur, quelles que soient les modifications éventuellement apportées à l'objet.

Par exemple, l'implémentation de la classe GetHashCode fournie par la classe String retourne des codes de hachage uniques pour des valeurs de chaîne uniques. 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). GetHashCode doit toujours retourner la même valeur pour une instance donnée de l'objet. Pour les classes dérivées de Object, GetHashCode peut déléguer à l'implémentation 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 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 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 Hashtable ne fonctionne pas correctement.

Dans certains cas, GetHashCode est implémenté 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 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile pour Pocket PC, Windows Mobile pour Smartphone, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition

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

.NET Framework

Prise en charge dans : 2.0, 1.1, 1.0

.NET Compact Framework

Prise en charge dans : 2.0, 1.0
Afficher: