我有一个 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 空间上产生了更大的分散。现在,您会遇到很多冲突,因为像 AB000ABA000A 这样的字谜会发生冲突,但是使用上述哈希函数,哈希对输入的微小变化更加敏感。

对于更复杂但(可能)更好的散列函数,请考虑使用像 the shift-add-XOR hash 这样的字符串散列函数,它也有很好的分散性但不太直观。

希望这可以帮助!

关于c++ - 此示例的最佳字符串哈希函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19623878/

10-11 22:47
查看更多