Zauważyłem, że getHashCode()
w każdym kontrolce, elementach w WP7 jest metoda, która zwraca sekwencję liczb. Czy mogę użyć tego kodu skrótu do zidentyfikowania przedmiotu? Na przykład chcę zidentyfikować zdjęcie lub piosenkę w urządzeniu i sprawdzić, gdzie jest. Można to zrobić, jeśli hashcode podany dla określonych pozycji jest unikalny.
Czy możesz mi pomóc wyjaśnić, do czego służy kod hashCode getHashCode()
?
Odpowiedzi:
MSDN mówi :
Zasadniczo istnieją kody skrótów, które umożliwiają tworzenie tabel skrótów.
Gwarantujemy, że dwa równe obiekty mają równe kody skrótów. Nie ma gwarancji, że
dwa nierówne obiekty będą miały nierówne hashcodes (co jest nazywane kolizją).
źródło
Po zapoznaniu się z tym, o co w tym wszystkim chodzi, postanowiłem napisać, miejmy nadzieję, prostsze wyjaśnienie poprzez analogię:
Podsumowanie: Co to jest kod mieszający?
Przeczytaj poniżej, aby uzyskać więcej informacji:
Pomyśl o haszkodzie tak, jak o nas, próbując jednoznacznie zidentyfikować kogoś
Jestem detektywem szukającym przestępcy. Nazwijmy go Panem Okrutnym. (Był notorycznym mordercą, kiedy byłem dzieckiem - włamał się do domu porwanego i zamordował biedną dziewczynę, porzucił jej ciało i nadal jest na wolności - ale to osobna sprawa). Pan Cruel ma pewne szczególne cechy, których mogę użyć, aby jednoznacznie zidentyfikować go w morzu ludzi. W Australii mamy 25 milionów ludzi. Jednym z nich jest Pan Okrutny. Jak możemy go znaleźć?
Złe sposoby na zidentyfikowanie pana okrutnego
Najwyraźniej pan Cruel ma niebieskie oczy. To niewiele pomaga, ponieważ prawie połowa populacji Australii ma również niebieskie oczy.
Dobre sposoby na zidentyfikowanie pana okrutnego
Z czego jeszcze mogę skorzystać? Wiem: użyję odcisku palca!
Zalety :
Powyższe cechy ogólnie składają się na dobre funkcje skrótu.
Więc o co chodzi z „zderzeniami”?
Więc wyobraź sobie, że dostanę trop i znajdę kogoś pasującego do odcisków palców pana Cruela. Czy to oznacza, że znalazłem pana Okrutnego?
........być może! Muszę się bliżej przyjrzeć. Jeśli używam SHA256 (funkcja haszująca) i szukam małego miasteczka, w którym jest tylko 5 osób - to jest bardzo duża szansa, że go znalazłem! Ale jeśli używam MD5 (kolejna słynna funkcja haszująca) i sprawdzam odciski palców w mieście z + 2 ^ 1000 osób, to jest całkiem dobra możliwość, że dwie zupełnie różne osoby mogą mieć ten sam odcisk palca.
Więc jakie są korzyści z tego wszystkiego?
Jedyną prawdziwą zaletą haszowania jest to, że chcesz umieścić coś w tablicy skrótów - a w przypadku tablic skrótów chciałbyś szybko znaleźć obiekty - i właśnie tam pojawia się kod skrótu. szybko. To hack, który znacznie poprawia wydajność, ale niewielkim kosztem dokładności.
Wyobraźmy sobie więc, że mamy stół do haszowania wypełniony ludźmi - 25 milionów podejrzanych w Australii. Pan Cruel jest gdzieś tam ..... Jak możemy go naprawdę szybko znaleźć ? Musimy przejrzeć je wszystkie: znaleźć potencjalne dopasowanie lub w inny sposób uniewinnić potencjalnych podejrzanych. Nie chcesz brać pod uwagę wyjątkowych cech każdej osoby, ponieważ zajęłoby to zbyt dużo czasu. Czego byś użył zamiast tego? Użyłbyś hashcode! Kod skrótu może powiedzieć, czy dwie osoby są różne. Czy Joe Bloggs NIE jest Panem Okrutnym. Jeśli odciski nie pasują, to wiesz, że to zdecydowanie NIE jest Mr Cruel. Ale jeśli odciski palców się zgadzająnastępnie, w zależności od użytej funkcji skrótu, istnieje duże prawdopodobieństwo, że znalazłeś swojego mężczyznę. Ale to nie jest 100%. Jedynym sposobem, aby mieć pewność, jest dalsze dochodzenie: (i) czy miał okazję / motyw, (ii) świadkowie itp.
Jeśli używasz komputerów, jeśli dwa obiekty mają tę samą wartość kodu skrótu, musisz ponownie zbadać, czy są naprawdę równe. np. musiałbyś sprawdzić, czy obiekty mają np. taką samą wysokość, taką samą wagę itp., czy liczby całkowite są takie same, czy też customer_id jest zgodne, a następnie dojść do wniosku, czy są takie same. jest to zazwyczaj wykonywane przez implementację interfejsów IComparer lub IEquality.
Kluczowe podsumowanie
Zasadniczo hashcode to odcisk palca.
Obejście powyższego zajmie dobre 3 minuty. Może przeczytaj to kilka razy, aż będzie miało sens. Mam nadzieję, że to komuś pomogło, ponieważ nauczenie się tego wszystkiego wymagało wiele żalu!
źródło
GetHashCode()
służy do obsługi używania obiektu jako klucza dla tabel skrótów. (Podobna rzecz istnieje w Javie itp.). Celem każdego obiektu jest zwrócenie odrębnego kodu skrótu, ale często nie można tego całkowicie zagwarantować. Wymagane jest jednak, aby dwa logicznie równe obiekty zwracały ten sam kod skrótu.Typowa implementacja tablicy skrótów zaczyna się od wartości hashCode, przyjmuje moduł (w ten sposób ograniczając wartość w zakresie) i używa go jako indeksu do tablicy „segmentów”.
źródło
Nie jest unikalny dla WP7 - jest obecny we wszystkich obiektach .Net. W pewnym sensie robi to, co opisujesz, ale nie polecam go jako unikalnego identyfikatora w twoich aplikacjach, ponieważ nie ma gwarancji, że będzie unikalny.
Metoda Object.GetHashCode
źródło
To pochodzi z artykułu msdn tutaj:
https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/
„Chociaż można usłyszeć, jak ludzie twierdzą, że kody skrótów generują unikalną wartość dla danego wejścia, faktem jest, że chociaż jest to trudne do wykonania, technicznie możliwe jest znalezienie dwóch różnych danych wejściowych, które mają tę samą wartość . Jednak prawda czynniki decydujące o skuteczności algorytmu wyznaczania wartości skrótu leżą w długości generowanego kodu skrótu i złożoności danych, które są szyfrowane. "
Po prostu użyj algorytmu skrótu odpowiedniego do rozmiaru danych, a będzie on miał unikalne kody skrótu.
źródło