考虑这个课程:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个完美的散列函数,因为在内存中我们有:

因此,在红,5 bits存放一天(1〜31),在黄4 bits月商店(1〜12),其他年份存储(1至16777215).
完美的好处是hashFunction什么?AFAIK,它可以保证添加/删除/包含O(1)在一个HashSet但我能获得其他好处吗?
我看到很多哈希函数都使用素数,构造一个哈希函数的最佳方式是什么(我想创建一个完美的哈希函数是非常/罕见的)?
关于素数 - > 在这里回答
完美的哈希函数可确保您不会发生冲突.但是,为了能够使用一个,您必须确切地知道需要进行哈希处理的键值集合,这通常不是这种情况.
其他不太完美,但仍然很好的散列函数(以及碰撞解决机制)没有这个要求,并且计算速度非常快,所以它们通常更合适.