相关疑难解决方法(0)

617
推荐指数
11
解决办法
57万
查看次数

在重写hashCode()时使用较大的素数作为乘数

我已经阅读了过去几个小时的哈希码函数,并且在自定义哈希码实现中使用素数作为乘数已经积累了一些问题.如果我能对以下问题有所了解,我将不胜感激:

  • 在对@ mattb的答案的评论中,@ hstoerr主张使用更大的素数(例如524287)而不是公共素数31.我的问题是,给定一对或元素的哈希码函数的以下实现:

    @Override
    public int hashCode() {
        final int prime = 31;
        int hash1 = (pg1 == null) ? 0 : pg1.hashCode();
        int hash2 = (pg2 == null) ? 0 : pg2.hashCode();
        return prime * (hash1 ^ hash2);
    }
    
    Run Code Online (Sandbox Code Playgroud)

这不会导致返回的溢出,int如果prime是大数?

  • 假设溢出是没有问题的(JVM做一个自动施法)是它更好地做一个位位移,而不是一个演员?

  • 我认为哈希码函数的性能根据哈希码的复杂性而有很大差异.主乘数的大小是否不影响性能?

  • 在自定义哈希码函数中使用多个素数而不是单个乘法器更好/更智能/更快?如果没有,还有其他一些优势吗?请参阅@ jinguy对相关问题的回答中的示例:

    public int hashCode() {
        return a * 13 + b.hashCode() * 23 + (c? 31: 7);
    }
    
    Run Code Online (Sandbox Code Playgroud)

其中a是一个int,b是一个 …

java hash primes hashcode

12
推荐指数
1
解决办法
1637
查看次数

标签 统计

hashcode ×2

java ×2

equals ×1

hash ×1

overriding ×1

primes ×1