我正在寻找一个哈希函数,它可以对非重复整数列表进行哈希处理,同时忽略它们的顺序。
我想要这两个列表
l1 = [0, 1, 3, 7]
l2 = [7, 3, 1, 0]
Run Code Online (Sandbox Code Playgroud)
具有相同的哈希值。
我有一个算法可以找到图上的顶点列表。在无向图中,算法会以不同的顺序多次查找某些列表。以我目前对算法的理解,过滤掉重复项比重新发明算法更容易。出于性能原因,我知道对找到的顶点列表进行散列比比较整个列表更容易。
现在,我看到了
XOR或一个简单的总和可能就是答案。鉴于
我有这种感觉,应该有一个相对简单直接的答案,只是我还没有找到。
使用乘积、总和 和 的组合^。所有这些都与无符号数学是可交流的(与顺序无关)。
unsigned long long product = 1;
unsigned sum = 0; // Maybe unsigned long long
unsigned x = 0;
for (i=0; i < array_element_count; i++) {
product *= l[i];
sum += l[i];
x ^= l[i];
}
unsigned long long pre_hash = product + sum + ((unsigned long long) x << 32));
unsigned hash = pre_hash % hash_table_size;
Run Code Online (Sandbox Code Playgroud)
提示:hash_table_size应该是有效使用所有位的质数。pre_hash
如果array_element_count很高,我会考虑p *= shift_right_until_odd(l[i]),否则p经常会变成0。
如果l[i] == 0 p *= l[i] 值得一些不同的东西。一个简单的缓解措施是p *= l[i] | 1,但那是凭空而来的。
散列需要时间才能实现良好的设计,以上是 OP 的候选构建块。