我有一个 AcccAA 类型的键,其中 A-[A...Z](大写字母),c 是 [1..9]。我有 1500 个段。
现在我的临时哈希函数
int HashFunc(string key){
int Adress = ((key[0] + key[1] + key[2] + key[3] + key[4] + key[5]) - 339) * 14;
return Adress;
}
和 Excel 在中心显示很多碰撞(从 400 到 900)
请告诉我哈希函数更均匀。
最佳答案
在这种情况下,构建散列函数的一种常见方法是评估一些具有质数系数的多项式,如下所示:
int address = key[0] +
31 * key[1] +
137 * key[2] +
1571 * key[3] +
11047 * key[4] +
77813 * key[5];
return address % kNumBuckets;
这在 key 空间上产生了更大的分散。现在,您会遇到很多冲突,因为像
AB000A
和 BA000A
这样的字谜会发生冲突,但是使用上述哈希函数,哈希对输入的微小变化更加敏感。对于更复杂但(可能)更好的散列函数,请考虑使用像 the shift-add-XOR hash 这样的字符串散列函数,它也有很好的分散性但不太直观。
希望这可以帮助!
关于c++ - 此示例的最佳字符串哈希函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19623878/