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í funkce hash.
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 naleznete v tématu Doplňkové poznámky k rozhraní API pro Object.GetHashCode.
Poznámky pro dědice
Funkce hash se používá k rychlému vygenerování čísla (kódu hash), který odpovídá hodnotě objektu. Funkce hash jsou obvykle specifické pro každý typ a pro jedinečnost musí jako vstup použít alespoň jedno z polí instance. Kódy hash by se neměly vypočítat pomocí hodnot statických polí.
Pro třídy odvozené z Object, GetHashCode metoda může delegovat na implementaci základní třídy GetHashCode() pouze v případě, že odvozená třída definuje rovnost být referenční rovnost. Výchozí implementace pro odkazové GetHashCode() typy vrátí hash kód, který je ekvivalentní tomu, který vrací GetHashCode(Object) metoda. U neměnných typů odkazů můžete přepsat GetHashCode() . Obecně platí, že pro proměnlivé odkazové typy byste měli přepsat GetHashCode() pouze v případě, že:
Kód hash můžete vypočítat z polí, která nejsou proměnlivá. Nebo
Můžete zajistit, aby se kód hash proměnlivého objektu nezměnil, když je objekt obsažen v kolekci, která spoléhá na jeho hashovací kód.
V opačném případě se můžete zamyslet nad ztrátou proměnlivého objektu v tabulce hash. Pokud se rozhodnete přepsat GetHashCode() pro proměnlivý odkazový typ, měla by vaše dokumentace jasně určit, že uživatelé vašeho typu by neměli upravovat hodnoty objektů, zatímco je objekt uložen v tabulce hash.
Pro typy GetHashCode() hodnot poskytuje výchozí implementaci kódu hash, která používá reflexi. Měli byste zvážit jeho přepsání pro lepší výkon.
Další informace a příklady, které počítají kódy hash různými způsoby, najdete v části Příklady.
Funkce hash 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 stejné, GetHashCode() metody pro tyto dva objekty nemusí vracet různé hodnoty.
Metoda GetHashCode() objektu musí konzistentně vrátit stejný hash kód, pokud neexistuje žádná změna stavu objektu, který určuje návratovou hodnotu System.Object.Equals metody objektu . Mějte na paměti, že platí pouze pro aktuální spuštění aplikace a že je možné vrátit jiný kód hash, pokud je aplikace spuštěna znovu.
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ý. Implikací je, že malé úpravy stavu objektu by měly vést k velkým úpravám výsledného kódu hash pro nejlepší výkon hashovací tabulky.
Funkce hash by měly být pro výpočty levné.
Metoda GetHashCode() by neměla vyvolat výjimky.
Například implementace GetHashCode() metody poskytované String třídou vrací stejné hashové kódy pro stejné řetězcové hodnoty. Proto dva String objekty vrátí stejný hash kód, pokud představují stejnou řetězcovou hodnotu. Metoda také používá všechny znaky v řetězci ke generová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žší 128 znaků ASCII, i když řetězec může obsahovat libovolný z 65 535 znaků Unicode).
Poskytnutí dobré hashové funkce třídy může výrazně ovlivnit výkon přidávání těchto objektů do tabulky hash. V tabulce hash s klíči, které poskytují dobrou implementaci funkce hash, trvá hledání prvku konstantní čas (například operace O(1). V tabulce hash s špatnou implementací funkce hash závisí výkon vyhledávání na počtu položek v tabulce hash (například operace O(n), kde n je počet položek v tabulce hash). 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 tabulkách hash za následujících podmínek:
Když funkce hash generují časté kolize.
Pokud velká část objektů v tabulce hash vytváří kódy hash, které jsou stejné nebo přibližně rovny sobě navzájem.
Když uživatelé zadávají data, ze kterých se vypočítá kód hash.
Odvozené třídy, které přepisují GetHashCode() , musí také přepsat Equals(Object) , aby zajistily, že dva objekty považovány za stejné mají stejný hash kód; jinak Hashtable typ nemusí fungovat správně.