2012-10-31 12 views

Odpowiedz

16

Jaki pożytek może ktoś zrobić z hashcode?

Szybko znajdź potencjalnie równych obiektów. Ta metoda jest zwykle używana przez typy, takie jak Dictionary<TKey, TValue> (dla kluczy) i HashSet<T>.

Powinieneś nie założyć, że obiekty z równymi kodami hash są jednakowe. Więcej informacji można znaleźć na stronie Eric Lippert's blog post, a na stronie Wikipedia hash table w celu uzyskania bardziej ogólnej dyskusji na temat zastosowań kodów skrótów.

+0

klucze? czy klucze nie są uważane za różne za pomocą metody równości? (IEquatable)? –

+0

@RoyiNamir: Tak, ale są * najpierw * porównywane przez kod skrótu - ponieważ w ten sposób można tanio uzyskać * potencjalny * mecz. W przeciwnym razie każde pobranie ze słownika wymagałoby sprawdzenia równości wobec każdego klucza. –

+0

Dlaczego kompilator powinien zawracać sobie głowę możliwością dopasowania, jeśli równi mogą zniszczyć jego założenie? (Wiem, że przesłonięcie równa się wymaganiom overring getHashCode) - ale to kolejne pytanie. –

2

Kod skrótu jest wartością liczbową używaną do identyfikacji obiektu podczas testowania równości. Może również służyć jako indeks dla obiektu w kolekcji.

Metoda GetHashCode jest odpowiednia do użycia w algorytmach mieszających i strukturach danych, takich jak tablica skrótów.

Domyślna implementacja metody GetHashCode nie gwarantuje, że unikalne wartości zwracane dla różnych obiektów są . Co więcej, struktura .NET Framework nie gwarantuje domyślnej implementacji metody GetHashCode, a zwracana wartość będzie taka sama między różnymi wersjami .NET Framework. W związku z tym domyślna implementacja tej metody nie może być używana jako unikatowy identyfikator obiektu do celów mieszania.

Metoda GetHashCode może być nadpisana przez typ pochodny. Wartości typów muszą zastąpić tę metodę, aby zapewnić funkcję skrótu, która jest odpowiednia dla tego typu i zapewnić użyteczną dystrybucję w tabeli mieszania . W przypadku unikalności kod skrótu musi być oparty na wartości pola instancji lub właściwości zamiast właściwości pola statycznego lub właściwości .

Obiekty używane jako klucz w obiekcie Hashtable muszą również przesłonić metodę GetHashCode, ponieważ te obiekty muszą generować własny kod mieszania . Jeśli obiekt użyty jako klucz nie zapewnia użytecznej implementacji kodu GetHashCode, można określić dostawcę kodu skrótu podczas konstruowania obiektu HashTable. Przed .NET Framework wersja 2.0, dostawca kodu skrótu był oparty na interfejsie System.Collections.IHashCodeProvider . Począwszy od wersji 2.0, dostawca kodu skrótu jest oparty na interfejsie System.Collections.IEqualityComparer o numerze .

- Sourced from MSDN:

0

Podstawowym założeniem jest to, że jeśli dwa obiekty mają inny kod skrótu, są one różne.Jeśli mają ten sam kod skrótu, mogą być różne lub równe.

Aby sprawdzić, czy obiekt jest obecny w zbiorze, możesz najpierw sprawdzić kody skrótów, co jest szybkie, ponieważ porównujesz liczby całkowite, a następnie wykonać dokładniejszy test tylko na obiektach z tym samym kodem mieszania.

Jest to używane na przykład w klasach kolekcji.

0

GetHashCode

GetHashCode istnieje tylko na rzecz tych dwóch rodzajów

->Hashtable

->GenericDictionary

GetHashCode daje różne klucze dla dobrego hashtable wydajności .

Równa

Równa przedstawia porównanie null-safe równości gdy typy są znane w czasie kompilacji. jego podpis to

public static bool Equals(object A,object B).

Więc nie można używać operatorów jak == lub != jeśli typ jest znany w czasie kompilacji time.You użyć Equals

Jego przydatna przy pisaniu typy generyczne

na przykład:

class Test<T> 
{ 
    T value; 
    public void SetV(T newValue) 
    { 
    if(object.Equals(newValue,value)) 
    //We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time 
    } 
} 

ToString

Zwraca wartość domyślną texual representation instancji typu.Thi s metoda jest przesłonięta przez wszystkie zbudowane w rodzaju

gettype

GetType jest oceniany na runtime.It pomaga nam znać typ za name, assemby, base type ..i inni

Powiązane problemy