完美的散列功能和优点

use*_*315 7 java hash

考虑这个课程:

    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但我能获得其他好处吗?

我看到很多哈希函数都使用素数,构造一个哈希函数的最佳方式是什么(我想创建一个完美的哈希函数是非常/罕见的)?


编辑:

关于素数 - > 在这里回答

Jua*_*mpi 8

完美的哈希函数可确保您不会发生冲突.但是,为了能够使用一个,您必须确切地知道需要进行哈希处理的键值集合,这通常不是这种情况.

其他不太完美,但仍然很好的散列函数(以及碰撞解决机制)没有这个要求,并且计算速度非常快,所以它们通常更合适.