Object.GetHashCode Methode

Definitie

Fungeert als de standaardhashfunctie.

public:
 virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer

Retouren

Een hashcode voor het huidige object.

Opmerkingen

Zie Aanvullende API-opmerkingen voor Object.GetHashCode voor meer informatie over deze API.

Notities voor overnemers

Een hash-functie wordt gebruikt om snel een getal (hashcode) te genereren dat overeenkomt met de waarde van een object. Hash-functies zijn meestal specifiek voor elk type en moeten voor uniekheid ten minste één van de exemplaarvelden als invoer gebruiken. Hash-codes mogen niet worden berekend met behulp van de waarden van statische velden.

Voor klassen die zijn afgeleid van Object, kan de GetHashCode methode alleen delegeren aan de basisklasse-implementatie GetHashCode() als de afgeleide klasse gelijkheid definieert om te verwijzen naar gelijkheid. De standaard implementatie van GetHashCode() referentietypen retourneert een hash-code die gelijk is aan de code die door de GetHashCode(Object) methode wordt geretourneerd. U kunt overschrijven GetHashCode() voor onveranderbare verwijzingstypen. Over het algemeen moet u voor onveranderbare verwijzingstypen alleen overschrijven GetHashCode() als:

  • U kunt de hashcode berekenen op basis van velden die niet kunnen worden gedempt; Of

  • U kunt ervoor zorgen dat de hashcode van een veranderlijk object niet verandert terwijl het object zich in een verzameling bevindt die afhankelijk is van de hashcode.

Anders denkt u dat het veranderlijke object verloren gaat in de hash-tabel. Als u ervoor kiest om te overschrijven GetHashCode() voor een onveranderbaar verwijzingstype, moet uw documentatie duidelijk maken dat gebruikers van uw type geen objectwaarden mogen wijzigen terwijl het object is opgeslagen in een hash-tabel.

Voor waardetypen GetHashCode() biedt u een standaard-hashcode-implementatie die gebruikmaakt van weerspiegeling. Overweeg deze te overschrijven voor betere prestaties.

Zie de sectie Voorbeelden voor meer informatie en voorbeelden die hashcodes op verschillende manieren berekenen.

Een hash-functie moet de volgende eigenschappen hebben:

  • Als twee objecten gelijk zijn aan elkaar vergelijken, moet de GetHashCode() methode voor elk object dezelfde waarde retourneren. Als twee objecten echter niet als gelijk worden vergeleken, hoeven de GetHashCode() methoden voor de twee objecten geen verschillende waarden te retourneren.

  • De GetHashCode() methode voor een object moet consistent dezelfde hash-code retourneren zolang er geen wijziging is in de objectstatus waarmee de retourwaarde van de methode System.Object.Equals van het object wordt bepaald. Houd er rekening mee dat dit alleen geldt voor de huidige uitvoering van een toepassing en dat een andere hash-code kan worden geretourneerd als de toepassing opnieuw wordt uitgevoerd.

  • Voor de beste prestaties moet een hash-functie een gelijkmatige distributie genereren voor alle invoer, inclusief invoer die sterk is geclusterd. Een implicatie is dat kleine wijzigingen in de objectstatus leiden tot grote wijzigingen in de resulterende hash-code voor de beste hashtabelprestaties.

  • Hash-functies moeten goedkoop zijn om te berekenen.

  • De GetHashCode() methode mag geen uitzonderingen genereren.

De implementatie van de GetHashCode() methode die door de String klasse wordt geleverd, retourneert bijvoorbeeld identieke hashcodes voor identieke tekenreekswaarden. Daarom retourneren twee String objecten dezelfde hashcode als ze dezelfde tekenreekswaarde vertegenwoordigen. De methode gebruikt ook alle tekens in de tekenreeks om redelijk willekeurig gedistribueerde uitvoer te genereren, zelfs wanneer de invoer is geclusterd in bepaalde bereiken (veel gebruikers kunnen bijvoorbeeld tekenreeksen hebben die alleen de lagere 128 ASCII-tekens bevatten, zelfs als een tekenreeks een van de 65.535 Unicode-tekens kan bevatten).

Het leveren van een goede hash-functie voor een klasse kan aanzienlijk van invloed zijn op de prestaties van het toevoegen van deze objecten aan een hash-tabel. In een hashtabel met sleutels die een goede implementatie van een hash-functie bieden, kost het zoeken naar een element constante tijd (bijvoorbeeld een O(1)-bewerking. In een hash-tabel met een slechte implementatie van een hash-functie is de prestaties van een zoekopdracht afhankelijk van het aantal items in de hash-tabel (bijvoorbeeld een O(n-bewerking, waarbij n het aantal items in de hash-tabel is). Een kwaadwillende gebruiker kan gegevens invoeren die het aantal botsingen verhogen, waardoor de prestaties van toepassingen die afhankelijk zijn van hashtabellen aanzienlijk kunnen afnemen, onder de volgende omstandigheden:

  • Wanneer hashfuncties frequente botsingen produceren.

  • Wanneer een groot deel van objecten in een hash-tabel hashcodes produceert die gelijk zijn aan of ongeveer gelijk zijn aan elkaar.

  • Wanneer gebruikers de gegevens invoeren waaruit de hashcode wordt berekend.

Afgeleide klassen die moeten GetHashCode() worden overschreven, moeten ook worden overschreven Equals(Object) om te garanderen dat twee objecten die als gelijk worden beschouwd, dezelfde hash-code hebben; anders werkt het Hashtable type mogelijk niet correct.

Van toepassing op

Zie ook