如何为排列编写好的hashCode()?

时间:2011-05-18 22:56:57

标签: java hash permutation hashcode

在我的程序中,我处理了很多大小 n 的列表,它们都是[1,..., n ]的排列。我的问题是我将这些排列放在HashMapHashSet中,我需要一个好的hashCode()来避免太多的碰撞。

我想到的所有解决方案都会导致很多冲突或溢出。 如何为排列编写好的hashCode?

3 个答案:

答案 0 :(得分:5)

你试过'rotating hash'吗?您可以调整桶旋转量以查看它是否与散列分布有很大差异。

答案 1 :(得分:4)

请参阅karmakaze的回答中的链接。它显示了更简洁的代码中的旋转移位,并讨论了具有不同基本哈希的一般细节(和问题)。


溢出也不错。只需将它模数回复:-)只考虑一个带XOR的简单移位并将“溢出”反馈回流中?

对于每个元素,考虑值i,其中h是long:

h ^= i;          // XOR in new data
h <<= 11;        // shift with a relatively long cycle
h ^= (h >>> 32); // feed the "overflow" back into the input
h &= 0xFFFF;     // throw out "overflow"

快乐的编码。

答案 2 :(得分:2)

你可以采取前n个素数并做

int hash = 0;
for(int i = 0; i<n;i++){
    hash +=  perm[i]*prime[i];//really unique will be hash +=Math.pow(prime[i],perm[i]) but will be to computationally heavy
}

溢出是一件非常好的事情,因为您将确保所有位都参与哈希