繁体   English   中英

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

[英]How to write a good hashCode() for permutations?

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

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

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

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


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

对于每个元素,考虑值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"

快乐的编码。

你可以采取前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
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM