Java 完善的哈希函数及其优点

Java 完善的哈希函数及其优点,java,hash,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; } //Som

以这一类为例:

    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;
        }
}
公共最终类MyDate{
私人整数年、月、日;
公共MyDate(整数年、整数月、整数日){
今年=年;
本月=月;
this.day=天;
}
//一些东西
@凌驾
公共int hashCode(){

return((p)一个完美的散列函数保证不会发生冲突。但是,为了能够使用一个函数,您必须准确地知道需要散列的键值集,通常情况并非如此

其他一些不是很完美,但仍然很好的散列函数(以及冲突解决机制)没有这个要求,而且计算速度非常快,因此它们通常更合适。

根据Juampi的说法,它很快。 多快? 约0(1)。 Redis是通过哈希表在内存中进行恒定时间查找的一个很好的例子

如果在散列结果中没有一个正好包含一个元素的bucket,那么需要使用equals来比较每个项,这样就可以得到O(1加z)的查找,其中z是bucket大小


但是,非常慢的散列函数肯定不是一个好主意。

只有当底层散列数组的大小适合所有可能的值时(这在jdk HashSet/HashMap中不太可能),您的完美散列函数才有用.我不明白:既然我可以在需要时轻松创建一个新实例,为什么还要在哈希集中放一个日期呢?@Andy,这就是一个例子