Object.GetHashCode Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Slouží jako výchozí hashovací funkce.
public:
virtual int GetHashCode();
public virtual int GetHashCode ();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Návraty
Kód hash pro aktuální objekt.
Poznámky
Další informace o tomto rozhraní API najdete v tématu Doplňkové poznámky k rozhraní API pro Object.GetHashCode.
Poznámky pro dědice
Hashovací funkce slouží k rychlému vygenerování čísla (hashového kódu), které odpovídá hodnotě objektu. Funkce hash jsou obvykle specifické pro každý typ a kvůli jedinečnosti musí jako vstup použít alespoň jedno z polí instance. Kódy hash by se neměly počítat pomocí hodnot statických polí.
U tříd odvozených z ObjectGetHashCode
může metoda delegovat na implementaci základní třídy GetHashCode() pouze v případě, že odvozená třída definuje rovnost jako rovnost odkazu. Výchozí implementace GetHashCode() pro referenční typy vrátí hashovací kód, který je ekvivalentní hodnotě vrácené metodou GetHashCode(Object) . Neměnné typy odkazů můžete přepsat GetHashCode() . Obecně platí, že u proměnlivých typů odkazů byste měli přepsat GetHashCode() pouze v následujících případech:
Kód hash můžete vypočítat z polí, která nejsou měnitelná. Nebo
Můžete zajistit, aby se kód hash proměnlivého objektu nezměnil, když je objekt obsažený v kolekci, která závisí na jeho hashovacím kódu.
V opačném případě se můžete domnívat, že v tabulce hash dojde ke ztrátě proměnlivého objektu. Pokud se rozhodnete přepsat GetHashCode() pro proměnlivý typ odkazu, v dokumentaci by mělo být jasné, že uživatelé vašeho typu by neměli upravovat hodnoty objektů, když je objekt uložený v tabulce hash.
Pro typy hodnot poskytuje výchozí implementaci hash kódu, GetHashCode() která používá reflexi. Měli byste zvážit jeho přepsání kvůli lepšímu výkonu.
Další informace a příklady, které výpočtu kódů hash různými způsoby, najdete v části Příklady.
Hashovací funkce musí mít následující vlastnosti:
Pokud se dva objekty porovnávají jako stejné, GetHashCode() musí metoda pro každý objekt vrátit stejnou hodnotu. Pokud se však dva objekty nerovnají jako rovny GetHashCode() , metody pro tyto dva objekty nemusí vracet různé hodnoty.
Metoda GetHashCode() pro objekt musí konzistentně vracet stejný hash kód, pokud nedojde k žádné změně stavu objektu, který určuje návratovou hodnotu system.Object.Equals metody objektu. Všimněte si, že to platí pouze pro aktuální spuštění aplikace a že při opětovném spuštění aplikace může být vrácen jiný hashový kód.
Pro zajištění nejlepšího výkonu by funkce hash měla vygenerovat rovnoměrnou distribuci pro všechny vstupy, včetně vstupu, který je silně clusterovaný. Z toho vyplývá, že malé změny stavu objektu by měly vést k rozsáhlým úpravám výsledného hashového kódu pro zajištění nejlepšího výkonu hashovací tabulky.
Funkce hash by měly být levné na výpočty.
Metoda GetHashCode() by neměla vyvolat výjimky.
Například implementace GetHashCode() metody poskytované String třídou vrací identické hashovací kódy pro identické řetězcové hodnoty. Proto dva String objekty vrátí stejný hash kód, pokud představují stejnou hodnotu řetězce. Metoda také používá všechny znaky v řetězci k vygenerování přiměřeně náhodně distribuovaného výstupu, i když je vstup seskupený v určitých oblastech (například mnoho uživatelů může mít řetězce, které obsahují pouze nižších 128 znaků ASCII, i když řetězec může obsahovat některý z 65 535 znaků Unicode).
Poskytnutí dobré hashovací funkce ve třídě může výrazně ovlivnit výkon přidávání těchto objektů do hashovací tabulky. V tabulce hash s klíči, které poskytují dobrou implementaci hashovací funkce, trvá hledání elementu konstantní dobu (například operace O(1). V hashovací tabulce se špatnou implementací hashovací funkce závisí výkon hledání na počtu položek v hashovací tabulce (například operace O(n
), kde n
je počet položek v hashovací tabulce). Uživatel se zlými úmysly může zadávat data, která zvyšují počet kolizí, což může výrazně snížit výkon aplikací závislých na hashovacích tabulkách za následujících podmínek:
Když funkce hash vytvářejí časté kolize.
Když velká část objektů v hashovací tabulce vytvoří hashovací kódy, které jsou navzájem stejné nebo přibližně rovny.
Když uživatelé zadává data, ze kterých se vypočítá hashovací kód.
Odvozené třídy, které přepíší GetHashCode() , musí také přepsat Equals(Object) , aby bylo zaručeno, že dva objekty považované za stejné mají stejný hashovací kód; Hashtable jinak typ nemusí správně fungovat.