Object.GetHashCode Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Fungerar som standard-hash-funktion.
public:
virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Returer
En hash-kod för det aktuella objektet.
Kommentarer
Mer information om det här API:et finns i Kompletterande API-kommentarer för Object.GetHashCode.
Anteckningar till arvingar
En hash-funktion används för att snabbt generera ett tal (hashkod) som motsvarar värdet för ett objekt. Hash-funktioner är vanligtvis specifika för varje typ och måste för unikhet använda minst ett av instansfälten som indata. Hash-koder bör inte beräknas med hjälp av värdena för statiska fält.
För klasser som härleds från ObjectGetHashCode kan metoden endast delegera till basklassimplementeringen GetHashCode() om den härledda klassen definierar likhet som referensjämlikhet. Standardimplementeringen av GetHashCode() för referenstyper returnerar en hash-kod som motsvarar den som returneras av GetHashCode(Object) metoden. Du kan åsidosätta GetHashCode() för oföränderliga referenstyper. För föränderliga referenstyper bör du i allmänhet endast åsidosätta GetHashCode() om:
Du kan beräkna hash-koden från fält som inte kan ändras. Eller
Du kan se till att hash-koden för ett föränderligt objekt inte ändras medan objektet finns i en samling som förlitar sig på dess hash-kod.
Annars kanske du tror att det föränderliga objektet går förlorat i hash-tabellen. Om du väljer att åsidosätta GetHashCode() för en föränderlig referenstyp bör dokumentationen klargöra att användare av din typ inte ska ändra objektvärden medan objektet lagras i en hash-tabell.
För värdetyper GetHashCode() tillhandahåller en standardimplementering av hash-kod som använder reflektion. Du bör överväga att åsidosätta det för bättre prestanda.
Mer information och exempel som beräknar hashkoder på flera olika sätt finns i avsnittet Exempel.
En hash-funktion måste ha följande egenskaper:
Om två objekt jämförs som lika GetHashCode() måste metoden för varje objekt returnera samma värde. Men om två objekt inte jämförs som lika behöver metoderna för de två objekten GetHashCode() inte returnera olika värden.
Metoden GetHashCode() för ett objekt måste konsekvent returnera samma hash-kod så länge det inte finns någon ändring i objekttillståndet som avgör returvärdet för objektets System.Object.Equals-metod . Observera att detta endast gäller för den aktuella körningen av ett program och att en annan hashkod kan returneras om programmet körs igen.
För bästa prestanda bör en hash-funktion generera en jämn distribution för alla indata, inklusive indata som är kraftigt klustrade. En implikation är att små ändringar i objekttillståndet bör resultera i stora ändringar i den resulterande hashkoden för bästa hash-tabellprestanda.
Hash-funktioner bör vara billiga att beräkna.
Metoden GetHashCode() bör inte utlösa undantag.
Implementeringen av metoden GetHashCode() som tillhandahålls av String klassen returnerar till exempel identiska hash-koder för identiska strängvärden. Därför returnerar två String objekt samma hash-kod om de representerar samma strängvärde. Metoden använder också alla tecken i strängen för att generera rimligt slumpmässigt distribuerade utdata, även när indata grupperas i vissa intervall (till exempel kan många användare ha strängar som bara innehåller de lägre 128 ASCII-tecknen, även om en sträng kan innehålla något av de 65 535 Unicode-tecknen).
Att tillhandahålla en bra hash-funktion i en klass kan avsevärt påverka prestanda för att lägga till dessa objekt i en hash-tabell. I en hash-tabell med nycklar som ger en bra implementering av en hash-funktion tar det konstant tid att söka efter ett element (till exempel en O(1)-åtgärd). I en hash-tabell med en dålig implementering av en hash-funktion beror prestanda för en sökning på antalet objekt i hash-tabellen (till exempel en O(n)-åtgärd, där n är antalet objekt i hash-tabellen). En obehörig användare kan mata in data som ökar antalet kollisioner, vilket avsevärt kan försämra prestandan för program som är beroende av hash-tabeller under följande förhållanden:
När hash-funktioner ger upphov till frekventa kollisioner.
När en stor del av objekten i en hashtabell skapar hash-koder som är lika med eller ungefär lika med varandra.
När användarna anger de data som hashkoden beräknas från.
Härledda klasser som åsidosätter GetHashCode() måste också åsidosättas Equals(Object) för att garantera att två objekt som anses vara lika har samma hash-kod. Annars Hashtable kanske typen inte fungerar korrekt.