Object.GetHashCode Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Służy jako domyślna funkcja skrótu.
public:
virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Zwraca
Kod skrótu dla bieżącego obiektu.
Uwagi
Aby uzyskać więcej informacji na temat tego interfejsu API, zobacz Dodatkowe uwagi dotyczące interfejsu API dla obiektu Object.GetHashCode.
Notatki dotyczące dziedziczenia
Funkcja skrótu służy do szybkiego generowania liczby (kodu skrótu), która odpowiada wartości obiektu. Funkcje skrótu są zwykle specyficzne dla każdego typu, a w przypadku unikatowości muszą używać co najmniej jednego z pól wystąpienia jako danych wejściowych. Kody skrótów nie powinny być obliczane przy użyciu wartości pól statycznych.
W przypadku klas pochodnych Objectz GetHashCode metody metoda może delegować do implementacji klasy GetHashCode() bazowej tylko wtedy, gdy klasa pochodna definiuje równość jako równość odwołania. Domyślna implementacja dla typów referencyjnych GetHashCode() zwraca kod skrótu, który jest odpowiednikiem tego, który jest zwracany przez metodę GetHashCode(Object) . Można zastąpić niezmienne GetHashCode() typy odwołań. Ogólnie rzecz biorąc, w przypadku typów odwołań modyfikowalnych należy zastąpić GetHashCode() tylko wtedy, gdy:
Możesz obliczyć kod skrótu z pól, które nie są modyfikowalne; Lub
Możesz upewnić się, że kod skrótu obiektu modyfikowalnego nie zmienia się, gdy obiekt znajduje się w kolekcji, która opiera się na jego kodzie skrótu.
W przeciwnym razie można pomyśleć, że obiekt modyfikowalny zostanie utracony w tabeli skrótów. Jeśli zdecydujesz się zastąpić GetHashCode() dla modyfikowalnego typu odwołania, dokumentacja powinna wyjaśnić, że użytkownicy typu nie powinni modyfikować wartości obiektów, gdy obiekt jest przechowywany w tabeli skrótów.
W przypadku typów GetHashCode() wartości udostępnia domyślną implementację kodu skrótu, która używa odbicia. Należy rozważyć zastąpienie go w celu uzyskania lepszej wydajności.
Aby uzyskać więcej informacji i przykłady dotyczące kodów skrótów obliczeniowych na różne sposoby, zobacz sekcję Przykłady.
Funkcja skrótu musi mieć następujące właściwości:
Jeśli dwa obiekty są porównywane jako równe, GetHashCode() metoda dla każdego obiektu musi zwrócić tę samą wartość. Jeśli jednak dwa obiekty nie są porównywane jako równe, GetHashCode() metody dla tych dwóch obiektów nie muszą zwracać różnych wartości.
GetHashCode() Metoda obiektu musi stale zwracać ten sam kod skrótu, o ile nie ma modyfikacji stanu obiektu, który określa wartość zwracaną metody System.Object.Equals obiektu. Należy pamiętać, że dotyczy to tylko bieżącego wykonywania aplikacji i że w przypadku ponownego uruchomienia aplikacji może zostać zwrócony inny kod skrótu.
Aby uzyskać najlepszą wydajność, funkcja skrótu powinna wygenerować równomierną dystrybucję dla wszystkich danych wejściowych, w tym danych wejściowych, które są silnie klastrowane. Implikacją jest to, że małe modyfikacje stanu obiektu powinny spowodować duże modyfikacje wynikowego kodu skrótu w celu uzyskania najlepszej wydajności tabeli skrótów.
Funkcje skrótu powinny być niedrogie do obliczeń.
Metoda GetHashCode() nie powinna zgłaszać wyjątków.
Na przykład implementacja metody dostarczonej GetHashCode() przez String klasę zwraca identyczne kody skrótów dla identycznych wartości ciągów. W związku z tym dwa String obiekty zwracają ten sam kod skrótu, jeśli reprezentują tę samą wartość ciągu. Ponadto metoda używa wszystkich znaków w ciągu do generowania rozsądnie losowo rozproszonych danych wyjściowych, nawet jeśli dane wejściowe są klastrowane w niektórych zakresach (na przykład wielu użytkowników może mieć ciągi zawierające tylko mniejsze 128 znaków ASCII, mimo że ciąg może zawierać dowolny z 65 535 znaków Unicode).
Zapewnienie dobrej funkcji skrótu w klasie może znacząco wpłynąć na wydajność dodawania tych obiektów do tabeli skrótów. W tabeli skrótów z kluczami, które zapewniają dobrą implementację funkcji skrótu, wyszukiwanie elementu wymaga stałego czasu (na przykład operacji O(1). W tabeli skrótów ze słabą implementacją funkcji skrótu wydajność wyszukiwania zależy od liczby elementów w tabeli skrótów (na przykład operacji O(n), gdzie n jest to liczba elementów w tabeli skrótów. Złośliwy użytkownik może wprowadzać dane wejściowe, które zwiększają liczbę kolizji, co może znacznie obniżyć wydajność aplikacji, które zależą od tabel skrótów, w następujących warunkach:
Gdy funkcje skrótu generują częste kolizje.
Gdy duża część obiektów w tabeli skrótów generuje kody skrótów, które są równe lub w przybliżeniu równe sobie.
Gdy użytkownicy wejdą dane, z których jest obliczany kod skrótu.
Klasy pochodne, które zastępują GetHashCode() , muszą również zastąpić Equals(Object) , aby zagwarantować, że dwa obiekty uważane za równe mają ten sam kod skrótu; w przeciwnym razie Hashtable typ może nie działać poprawnie.