为复合整数键实现hashCode()

时间:2012-08-20 09:02:12

标签: java

我有一个有三个整数来表示它的类:serverID,streamID和messageID。

我有一些HashSet很小但是我做了很多东西,比如设置交叉点,而其他的东西都有10K +元素。

serverID只有少数几个值,但它们是真正的随机数,具有完整的32位随机性。整个哈希表通常只有一个serverID;其他时候只是几个serverID。

streamID是一个小数字,通常为0但有时可能为1或2。

对于每个serverID / streamID对,messageID会逐渐增加。

我目前有:

(-messageID << 24) ^ messageID ^ serverID ^ streamID

我想要理解我有一个很好的哈希函数,尽管有一个顺序增加的messageID而不是很多其他位混合。

什么是好的hashCode,我怎样才能最好地混合这三个数字呢?

2 个答案:

答案 0 :(得分:1)

eclipse给它自己很好的哈希码生成

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + messageID;
    result = prime * result + serverID;
    result = prime * result + streamID;
    return result;
}

答案 1 :(得分:1)

我个人总是使用java.lang.String中实施的策略:

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }

因此,在您的情况下,我会使用以下内容:31 * (31 * messageID + serverID) + streamID