我想对一组整数进行哈希处理,以使整数的顺序对计算出的哈希值没有影响。即H([32224,12232,564423]) == H([564423,32224,12232])
。
唯一集合的数量将在数百万的范围内。速度是非常重要,但是我需要使用一种选择的方法来了解碰撞的上限。
Wikipedia在hashing vectors上有一个不错的部分,但是我不理解它背后的数学原理来自信地在代码中实现它们。如果有人可以解释一些代码所涉及的数学运算,我将不胜感激。理想情况下,我希望最终的哈希为32位。如果有什么用,我将用Java实现。
更新:由于性能原因(在许多此类集合上进行操作),我特别希望避免对集合中的整数进行排序。
最佳答案
一种简单的方法是将各个整数的哈希值进行异或运算或相加。 xor和add是可交换的,因此满足顺序独立性。
因此:
int hc = 0;
for(int i = 0; i < n; i++) {
hc += a[i];
}
return hc;
或者
int hc = 0;
for(int i = 0; i < n; i++) {
hc ^= a[i];
}
return hc;
因为int的哈希码始终是它的值。
实际上,这正是
HashSet<Integer>.hashCode
(使用add)的作用。如果您的整数已经装箱,或者您可以处理它们的装箱,那么这是一个内置的解决方案。