在我的程序中,我处理了很多大小 n 的列表,它们都是[1,..., n ]的排列。我的问题是我将这些排列放在HashMap
和HashSet
中,我需要一个好的hashCode()
来避免太多的碰撞。
我想到的所有解决方案都会导致很多冲突或溢出。 如何为排列编写好的hashCode? p>
答案 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
}
溢出是一件非常好的事情,因为您将确保所有位都参与哈希