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:
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
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
Nie rozumiem: dlaczego umieścić datę w haszowaniu, kiedy mogę łatwo utworzyć nową instancję, kiedy jej potrzebuję? – Andy
@Andy To jest przykład – user2336315