Udostępnij za pośrednictwem


Object.GetHashCode Metoda

Definicja

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

Wartość skrótu dla bieżącego obiektu.

Uwagi

Aby uzyskać więcej informacji na temat tego interfejsu API, zobacz Dodatkowe uwagi interfejsu API dla obiektu Object.GetHashCode.

Uwagi 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 należy użyć 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 z ObjectGetHashCode 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ć GetHashCode() niezmienialnymi typami referencyjnymi. Ogólnie rzecz biorąc, w przypadku typów odwołań modyfikowalnych należy zastąpić GetHashCode() tylko wtedy, gdy:

  • Kod skrótu można obliczyć 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 typu odwołania modyfikowalnego, 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ładów 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.

  • Metoda GetHashCode() obiektu musi stale zwracać ten sam kod skrótu, o ile nie ma modyfikacji stanu obiektu, który określa wartość zwracaną przez metodę System.Object.Equals obiektu. Należy pamiętać, że jest to prawda tylko w przypadku bieżącego wykonywania aplikacji i że można zwrócić inny kod skrótu, jeśli aplikacja zostanie uruchomiona ponownie.

  • 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ótu.

  • Funkcje skrótu powinny być niedrogie do obliczenia.

  • Metoda GetHashCode() nie powinna zgłaszać wyjątków.

Na przykład implementacja metody dostarczonej GetHashCode()String przez 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 rozproszonych danych wyjściowych, nawet jeśli dane wejściowe są klastrowane w określonych 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ć dowolne 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 wprowadzić dane, 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 tworzy 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.

Dotyczy

Zobacz też