(0) exportieren Drucken
Alle erweitern

Object.GetHashCode-Methode

Aktualisiert: November 2007

Fungiert als Hashfunktion für einen bestimmten Typ.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

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

Rückgabewert

Typ: System.Int32
Ein Hashcode für das aktuelle Object.

Sie können die GetHashCode-Methode in Hashalgorithmen und Datenstrukturen wie Hashtabellen verwenden.

Die Standardimplementierung der GetHashCode-Methode garantiert keine eindeutigen Rückgabewerte für andere Objekte. Darüber hinaus werden in .NET Framework keine Standardimplementierung der GetHashCode-Methode und kein einheitlicher Rückgabewert in unterschiedlichen Versionen von .NET Framework garantiert. Hieraus folgt, dass die Standardimplementierung dieser Methode nicht als eindeutiger Objektbezeichner bei Hashoperationen verwendet werden darf.

Die GetHashCode-Methode kann von einem abgeleiteten Typ überschrieben werden. Werttypen müssen diese Methode überschreiben, um eine für diesen Typ geeignete Hashfunktion bereitzustellen und eine sinnvolle Verteilung in der Hashtabelle zu gewährleisten. Die besten Ergebnisse werden erzielt, wenn der Hashcode auf dem Wert eines Instanzfelds oder einer Instanzeigenschaft und nicht auf dem Wert eines statischen Felds oder einer statischen Eigenschaft beruht.

Objekte, die als Schlüssel in einem Hashtable-Objekt verwendet werden, müssen die GetHashCode-Methode ebenfalls überschreiben, da solche Objekte eigenen Hashcode generieren müssen. Wenn ein als Schlüssel verwendetes Objekt keine geeignete Implementierung von GetHashCode bereitstellt, können Sie bei der Erstellung des Hashtable-Objekts einen Hashcodeanbieter angeben. Vor .NET Framework, Version 2.0, basierte der Hashcodeanbieter auf der System.Collections.IHashCodeProvider-Schnittstelle. Ab Version 2.0 basiert der Hashcodeanbieter auf der System.Collections.IEqualityComparer-Schnittstelle.

Hinweise zur Implementierung:

Eine Hashfunktion wird zum schnellen Generieren eine Zahl (Hashcode) verwendet, die dem Wert eines Objekts entspricht. Hashfunktionen sind i. d. R. für jeden Type spezifisch und müssen mindestens eines der Instanzfelder als Eingabe verwenden.

Eine Hashfunktion muss folgende Eigenschaften aufweisen:

  • Wenn ein Vergleich zweier Objekte deren Gleichheit ergibt, müssen die GetHashCode-Methoden beider Objekte den gleichen Wert zurückgeben. Wenn ein Vergleich zweier Objekte keine Gleichheit ergibt, müssen die GetHashCode-Methoden der Objekte jedoch nicht zwingend unterschiedliche Werte zurückgeben.

  • Die GetHashCode-Methode eines Objekts muss immer denselben Hashcode zurückgeben, solange keine Änderung des Objektzustands erfolgt, die den Rückgabewert der Equals-Methode des Objekts beeinflusst. Beachten Sie, dass diese Anforderungen lediglich für die aktuelle Ausführung einer Anwendung gelten und dass bei der nächsten Ausführung einer anderer Hashcode zurückgegeben werden kann.

  • Zu Optimierung der Leistung muss eine Hashfunktion eine Zufallsverteilung für alle möglichen Eingabewerte generieren.

Die Implementierung der GetHashCode-Methode in der String-Klasse gibt z. B. für identische Zeichenfolgenwerte identische Hashcodes zurück. Daher geben zwei String-Objekte denselben Hashcode zurück, wenn sie denselben Zeichenfolgenwert darstellen. Darüber hinaus verwendet die Methode sämtliche Zeichen der Zeichenfolge, um eine verhältnismäßig zufällig verteilte Ausgabe zu erzielen, auch wenn die Eingabe auf bestimmte Zeichenbereiche beschränkt ist (z. B. wenn viele Benutzer nur Zeichenfolgen verwenden, die die unteren 128 ASCII-Zeichen enthalten, obwohl eine Zeichenfolge jedes der 65.535 Unicode-Zeichen enthalten könnte).

Bei von Object abgeleiteten Klassen kann die GetHashCode-Methode ihre Aufgabe dann und nur dann an die Object.GetHashCode-Implementierung delegieren, wenn die abgeleitete Klasse Wertgleichheit als Verweisgleichheit definiert und der Typ kein Werttyp ist.

Das Bereitstellen einer effizienten Hashfunktion für eine Klasse kann das Einfügen dieser Objekte in eine Hashtabelle erheblich beschleunigen. Bei einer Hashtabelle mit einer gut implementierten Hashfunktion wird die Suche nach einem Element in konstanter Zeit durchgeführt (eine O(1)-Operation). Bei einer Hashtabelle mit einer schlecht implementierten Hashfunktion hängt die Dauer der Suche von der Anzahl der Elemente in der Tabelle ab (sie ist z. B. eine O( n)-Operation, wobei n die Anzahl der Elemente in der Hashtabelle bezeichnet). Hashfunktionen müssen außerdem ohne viel Aufwand zu berechnen sein.

Implementierungen der GetHashCode-Methode dürfen nicht zu Zirkelverweisen führen. Wenn z. B. ClassA.GetHashCode ClassB.GetHashCode aufruft, darf ClassB.GetHashCode weder direkt noch indirekt ClassA.GetHashCode aufrufen.

Implementierungen der GetHashCode-Methode dürfen keine Ausnahmen auslösen.

Abgeleitete Klassen, die GetHashCode überschreiben, müssen außerdem Equals überschreiben, damit gewährleistet ist, dass zwei Objekte, die als gleich betrachtet werden, denselben Hashcode besitzen. Andernfalls könnte der Hashtable-Typ falsche Ergebnisse liefern.

In einigen Fällen ist die GetHashCode-Methode so implementiert, dass einfach ein ganzzahliger Wert zurückgegeben wird. Im folgenden Codebeispiel wird eine Implementierung von GetHashCode veranschaulicht, bei der ein ganzzahliger Wert zurückgegeben wird.

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


Häufig besitzt ein Typ mehrere Datenfelder, die zur Generierung des Hashcodes beitragen können. Eine Möglichkeit, einen Hashcode zu generieren, besteht darin, diese Felder wie im folgenden Codebeispiel mit einer XOR (eXclusive OR)-Operation miteinander zu verknüpfen.

using System;

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

   //other methods

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


Im folgenden Codebeispiel wird ein weiterer Fall veranschaulicht, in dem die Felder des Typs zur Generierung des Hashcodes mit XOR (eXclusive OR) verknüpft werden. Beachten Sie, dass in diesem Codebeispiel die Felder benutzerdefinierte Typen darstellen, von denen jeder GetHashCode und Equals implementiert.

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


Wenn der Datenmember einer abgeleiteten Klasse größer als Int32 ist, können die hohen und die niedrigen Bits des Werts mit einer XOR (eXclusive OR)-Operation verknüpft werden, wie im folgenden Codebeispiel gezeigt wird.

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 Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile für Smartphone, Windows Mobile für Pocket PC, Xbox 360

.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

.NET Framework

Unterstützt in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 3.5, 2.0, 1.0

XNA Framework

Unterstützt in: 2.0, 1.0

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft