2013-05-07 14 views
7

Rozważmy klasę:Idealna funkcja mieszania i korzyści

public final class MyDate { 
     private int year, month, day; 

     public MyDate(int year, int month, int day) { 
      this.year = year; 
      this.month = month; 
      this.day = day; 
     } 

     //Some stuff 

     @Override 
     public int hashCode() { 
      return ((year << 4) | month) << 5 | day; 
     } 
} 

To doskonała funkcja skrótu, bo w pamięci mamy:

enter image description here

Więc na czerwono, 5 bits sklep dzień (1 do 31), w kolorze żółtym 4 bits przechowywać miesiąc (od 1 do 12), a pozostałe przechowują rok (od 1 do 16777215).

Jaka jest korzyść z doskonałego hashFunction? AFAIK, może zagwarantować dodanie/usunięcie/zawiera w O(1) w HashSet, ale czy mogę uzyskać inne korzyści z posiadania?

Widziałem, że wiele funkcji skrótu używa liczb pierwszych, jaki jest najlepszy sposób na ich zbudowanie (wyobrażam sobie, że stworzenie idealnej funkcji skrótu jest rzadkie/rzadkie)?


EDIT:

O liczb pierwszych -> odpowiedział here

+0

Twoja idealna funkcja skrótu jest użyteczna tylko wtedy, gdy podstawowa tablica haszów jest dopasowywana do wszystkich możliwych wartości (co jest mało prawdopodobne w przypadku jdk HashSet/HashMap). – jtahlborn

+0

Nie rozumiem: dlaczego umieścić datę w haszowaniu, kiedy mogę łatwo utworzyć nową instancję, kiedy jej potrzebuję? – Andy

+0

@Andy To jest przykład – user2336315

Odpowiedz

8

Doskonałym funkcja hash gwarantuje, że będziesz miał żadnych kolizji. Jednak aby móc go używać, musisz dokładnie znać zestaw kluczowych wartości, które będą wymagać mieszania, co często nie jest możliwe.

Inne, nie tak doskonałe, ale nadal dobre funkcje skrótu (wraz z mechanizmem rozwiązywania kolizji) nie mają tego wymagania i są bardzo szybkie do obliczenia, więc często są bardziej odpowiednie.

1

Jak na Juampi jest szybki. Jak szybko? Około O (1). Redis jest doskonałym przykładem ciągłego wyszukiwania czasu w pamięci poprzez tablicę haszującą.

Jeśli nie masz kubka dokładnie jednego elementu na wynikach mieszania, musisz użyć równych wartości, aby porównać każdy element, aby uzyskać wynik O (1 plus z), gdzie z to rozmiar wiadra.

Ale tak bardzo powolne funkcje skrótu z pewnością nie są świetnym pomysłem po.

Powiązane problemy