Ein Hashcode ist ein numerischer Wert, der verwendet wird, um während der Gleichheitstests ein Objekt zu identifizieren. Es kann auch als Index für ein Objekt in einer Auflistung verwendet werden.
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. Um Eindeutigkeit herzustellen, muss der Hashcode auf dem Wert eines Instanzfelds oder einer Instanzeigenschaft und nicht auf dem Wert eines statischen Felds oder einer statischen Eigenschaft beruhen.
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 für Windows-Runtime
Wenn Sie die GetHashCode-Methode für eine Klasse in Windows-Runtime aufrufen, wird das Standardverhalten für Klassen, die nicht GetHashCode überschreiben. Dies ist ein Teil der Unterstützung, die .NET Framework für Windows-Runtime bietet (finden Sie .NET Framework-Unterstützung für Windows Store-Apps und Windows-Runtime). Klassen in Windows-Runtime erben nicht Object und derzeit nicht GetHashCode implementieren. jedoch würden Sie, ToString, Equals(Object) und GetHashCode-Methoden haben, wenn Sie sie im C#- oder Visual Basics verwenden, und .NET Framework stellt das Standardverhalten für diese Methoden.
Hinweis |
|---|
Windows-Runtime-Klassen, die in C# oder Visual Basic geschrieben werden, können die GetHashCode-Methode überschreiben. |
Hinweise zur Implementierung
Eine Hashfunktion wird zum schnellen Generieren einer Zahl (Hashcode) verwendet, die dem Wert eines Objekts entspricht.
Hashfunktionen sind i. d. R. für jeden Type spezifisch und müssen aus Gründen der Eindeutigkeit 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.GetHashCodeClassB.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.