我想对一组整数进行哈希处理,以使整数的顺序对计算出的哈希值没有影响。即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)的作用。如果您的整数已经装箱,或者您可以处理它们的装箱,那么这是一个内置的解决方案。

10-06 12:43