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

我有一些很小的HashSet,但是我做了很多类似设置交集的事情,还有一些包含10K +元素的事情。

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

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

对于每个serverID / streamID对,messageID依次增加。

我目前有:

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


我想了解,尽管messageID依次增加,但没有其他很多位可以混用,但我具有良好的哈希函数。

是什么使一个好的hashCode更好地混合这三个数字?

最佳答案

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

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


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

10-08 01:25