2009-03-19 6 views

Odpowiedz

8

Najbardziej widocznym sposobem jest mapowanie struktur.

Każda klasa, która to zrobi będzie nieprzewidywalna, gdy zostanie użyta jako klucz dla Słownika lub HashTable. Powodem jest to, że implementacja używa zarówno GetHashCode, jak i Equals, aby odpowiednio znaleźć wartość w tabeli. Krótka wersja algorytmu jest następujący

  1. Weź moduł do hashcode przez liczbę wiader i to indeks wiadro
  2. .equals call() dla określonego klucza i każdy klucz w szczególności wiadra .
  3. Jeśli istnieje dopasowanie, które jest wartością, brak zgodności = brak wartości.

Niepowodzenie synchronizacji GetHashCode i Equals spowoduje całkowite złamanie tego algorytmu (i wielu innych).

+0

dziękuję za wyczyszczenie tego. –

+0

W jaki sposób implementacja określa liczbę używanych wiaderek? Czy to jest stała wartość? –

7

Blog Jareda Parsonsa zawiera dobre wyjaśnienia dotyczące wdrażania równości i powodów, dla których GetHashCode jest tak ważny.

Properly Implementing Equality

+6

Czy bezwstydne jest umieszczanie linku do własnego bloga? – JaredPar

0

Jeśli nie zastępują GetHashCode, cokolwiek, który porównuje swoich obiektów może się to źle.

Jak to jest udokumentowane, że GetHashCode musi zwrócić tę samą wartość, jeśli dwie instancje są równe, to jest przywilejem dowolnego kodu, który chce przetestować je pod kątem równości, aby użyć GetHashCode jako pierwszego przejścia do grupowania obiektów, które mogą być równe (ponieważ wie, że obiekty z różnymi hasłami nie mogą być równe). Jeśli twoja metoda GetHashCode zwraca różne wartości dla równych obiektów, mogą one dostać się do różnych grup w pierwszym przebiegu i nigdy nie być porównywane przy użyciu ich metody Equals.

Może to mieć wpływ na strukturę danych typu kolekcji, ale byłoby szczególnie problematyczne w przypadku takich kodów opartych na hashach, takich jak słowniki i zestawy skrótów.

W skrócie: Zawsze zastępuj GetHashCode, gdy zastępujesz Equals i upewnij się, że ich implementacje są spójne.

0

Algorytm, który używa klucza nie działa, zakładając, że opiera się on na zamierzonym działaniu klawiszy skrótu.

Dwa obiekty, które mają numer Equal, powinny mieć tę samą wartość skrótu, która nie jest domyślnie zagwarantowana przez implementację.

1

Pomyśl o strukturze hash/słownikowej jako kolekcji numerowanych wiader. Jeśli zawsze umieszczasz rzeczy w wiadrze odpowiadające ich GetHashCode(), musisz przeszukać tylko jeden zasobnik (używając funkcji równań()), aby sprawdzić, czy coś tam jest. To działa, pod warunkiem, że patrzysz w odpowiednie wiadro.

Tak więc zasada jest taka: jeśli Equals() mówi, że dwa obiekty są równe(), muszą musi mieć mieć ten sam GetHashCode().

+0

Zamiast myśleć w kategoriach numerowanych wiader, myślę, że łatwiej jest powiedzieć, że kody skrótów są używane w celu uniknięcia porównań. Jeśli hashcode obiektu X jest znany - bez względu na sposób - nie pasuje do hashcode obiektu Y, nie ma potrzeby porównywania niczego na ich temat. Wiadra umożliwiają w prosty sposób ignorowanie przez kod elementów, których kody skrótów nie mogą równać się jakiejś określonej wartości, ale wiele kolekcji jawnie porównuje kody haszujące nawet elementów, które są sortowane do tego samego zasobnika. – supercat

Powiązane problemy