考慮這個類:完美的散列函數和福利
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;
}
}
這是一個完美的散列函數,因爲在存儲有:
因此,在紅,5 bits
店一天( 1到31),黃色4 bits
存儲月份(1到12),其他存儲年份(1到16777215)。
完美的hashFunction
有什麼好處? AFAIK,它可以保證在HashSet
中添加/刪除/包含在O(1)
中,但是我可以獲得其他好處嗎?
我看到許多散列函數使用素數,構建一個散列函數的最佳方式是什麼(我認爲創建一個完美的散列函數是不常見/罕見的)?
編輯:
關於素數 - >回答here
如果底層哈希數組的大小適合所有可能的值(這對於jdk HashSet/HashMap來說不太可能),那麼您的完美哈希函數纔有用。 – jtahlborn 2013-05-07 20:08:09
我不明白爲什麼當我需要一個新的實例時,我可以輕鬆創建一個新的實例,爲什麼要在一個哈希集中添加一個日期? – Andy 2013-05-07 20:50:29
@Andy這是一個例子 – user2336315 2013-05-07 20:52:43