考虑这个类:完美的散列函数和福利
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