Object.GetHashCode Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Fungiert als Standardhashfunktion.
public:
virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Gibt zurück
Ein Hashcode für das aktuelle Objekt.
Hinweise
Weitere Informationen zu dieser API finden Sie unter Ergänzende API-Hinweise für Object.GetHashCode.
Hinweise für Vererber
Eine Hashfunktion wird verwendet, um schnell eine Zahl (Hashcode) zu generieren, die dem Wert eines Objekts entspricht. Hashfunktionen sind in der Regel für jeden Typ spezifisch und müssen aus Gründen der Eindeutigkeit mindestens eines der instance Felder als Eingabe verwenden. Hashcodes sollten nicht mithilfe der Werte statischer Felder berechnet werden.
Für von Objectabgeleitete Klassen kann die GetHashCode
-Methode nur dann an die Basisklassenimplementierung GetHashCode() delegieren, wenn die abgeleitete Klasse die Gleichheit als Verweisgleichheit definiert. Die Standardimplementierung von GetHashCode() für Verweistypen gibt einen Hashcode zurück, der dem von der GetHashCode(Object) -Methode zurückgegebenen entspricht. Sie können unveränderliche Verweistypen überschreiben GetHashCode() . Im Allgemeinen sollten Sie für veränderliche Verweistypen nur überschreiben GetHashCode() , wenn:
Sie können den Hashcode aus Feldern berechnen, die nicht veränderlich sind. Oder
Sie können sicherstellen, dass sich der Hashcode eines veränderlichen Objekts nicht ändert, während das Objekt in einer Auflistung enthalten ist, die auf seinem Hashcode basiert.
Andernfalls denken Sie möglicherweise, dass das veränderliche Objekt in der Hashtabelle verloren geht. Wenn Sie einen veränderlichen Verweistyp außer Kraft GetHashCode() setzen, sollte in der Dokumentation klargestellt werden, dass Benutzer Ihres Typs keine Objektwerte ändern sollten, während das Objekt in einer Hashtabelle gespeichert wird.
Stellt für Werttypen eine Standardmäßige Hashcodeimplementierung bereit, GetHashCode() die Reflektion verwendet. Sie sollten erwägen, es zu überschreiben, um die Leistung zu verbessern.
Weitere Informationen und Beispiele zum Berechnen von Hashcodes auf verschiedene Weise finden Sie im Abschnitt Beispiele.
Eine Hashfunktion muss über die folgenden Eigenschaften verfügen:
Wenn zwei Objekte gleich sind, muss die GetHashCode() -Methode für jedes Objekt den gleichen Wert zurückgeben. Wenn jedoch zwei Objekte nicht gleich verglichen werden, müssen die GetHashCode() Methoden für die beiden Objekte keine unterschiedlichen Werte zurückgeben.
Die GetHashCode() -Methode für ein -Objekt muss konsistent denselben Hashcode zurückgeben, solange keine Änderung des Objektzustands erfolgt, der den Rückgabewert der System.Object.Equals-Methode des Objekts bestimmt. Beachten Sie, dass dies nur für die aktuelle Ausführung einer Anwendung gilt und dass ein anderer Hashcode zurückgegeben werden kann, wenn die Anwendung erneut ausgeführt wird.
Um eine optimale Leistung zu erzielen, sollte eine Hashfunktion eine gleichmäßige Verteilung für alle Eingaben generieren, einschließlich der Stark gruppierten Eingaben. Eine Implikation ist, dass kleine Änderungen am Objektzustand zu umfangreichen Änderungen am resultierenden Hashcode führen sollten, um eine optimale Hashtabellenleistung zu erzielen.
Hashfunktionen sollten kostengünstig in der Computeumgebung sein.
Die GetHashCode() -Methode sollte keine Ausnahmen auslösen.
Beispielsweise gibt die Implementierung der von der GetHashCode()String -Klasse bereitgestellten Methode identische Hashcodes für identische Zeichenfolgenwerte zurück. Daher geben zwei String Objekte denselben Hashcode zurück, wenn sie denselben Zeichenfolgenwert darstellen. Außerdem verwendet die -Methode alle Zeichen in der Zeichenfolge, um eine angemessen zufällig verteilte Ausgabe zu generieren, auch wenn die Eingabe in bestimmten Bereichen gruppiert ist (z. B. können viele Benutzer Zeichenfolgen haben, die nur die unteren 128 ASCII-Zeichen enthalten, obwohl eine Zeichenfolge eines der 65.535 Unicode-Zeichen enthalten kann).
Das Bereitstellen einer guten Hashfunktion für eine Klasse kann sich erheblich auf die Leistung beim Hinzufügen dieser Objekte zu einer Hashtabelle auswirken. In einer Hashtabelle mit Schlüsseln, die eine gute Implementierung einer Hashfunktion bereitstellen, dauert die Suche nach einem Element konstant (z. B. ein O(1)-Vorgang). In einer Hashtabelle mit einer schlechten Implementierung einer Hashfunktion hängt die Leistung einer Suche von der Anzahl der Elemente in der Hashtabelle ab (z. B. ein O(n
)-Vorgang, wobei n
die Anzahl der Elemente in der Hashtabelle ist). Ein böswilliger Benutzer kann Daten eingeben, die die Anzahl von Kollisionen erhöhen, was die Leistung von Anwendungen, die von Hashtabellen abhängen, unter den folgenden Bedingungen erheblich beeinträchtigen kann:
Wenn Hashfunktionen häufige Konflikte erzeugen.
Wenn ein großer Anteil von Objekten in einer Hashtabelle Hashcodes erzeugt, die gleich oder ungefähr gleich sind.
Wenn Benutzer die Daten eingeben, aus denen der Hashcode berechnet wird.
Abgeleitete Klassen, die außer Kraft setzen, müssen ebenfalls überschrieben Equals(Object) werden, um sicherzustellen, dass zwei Als gleich angesehene Objekte den gleichen Hashcode haben. Andernfalls GetHashCode() funktioniert der Hashtable Typ möglicherweise nicht ordnungsgemäß.