我有一个类型为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)
请告诉我哈希函数更均匀。
答案 0 :(得分:3)
在这种情况下构建哈希函数的一种常用方法是使用素数系数来计算一些多项式,如下所示:
int address = key[0] +
31 * key[1] +
137 * key[2] +
1571 * key[3] +
11047 * key[4] +
77813 * key[5];
return address % kNumBuckets;
这使得密钥空间的分散度大得多。现在,你会遇到很多冲突,因为像AB000A
和BA000A
这样的字谜会发生碰撞,但是对于上面的哈希函数,哈希对输入中的小变化更敏感。
对于更复杂但(可能)更好的哈希函数,请考虑使用像the shift-add-XOR hash这样的字符串哈希函数,它也可以获得良好的分散但不太直观。
希望这有帮助!
答案 1 :(得分:1)
一种方法是构造一个有保证的无冲突数(当然不会使哈希表冲突),只要可能的键适合整数类型(例如int
):
int number = (key[0] - 'A') + 26 * (
(key[1] - '0') + 10 * (
(key[2] - '0') + 10 * (
(key[3] - '0') + 10 * (
(key[4] - 'A') + 26 * (
(key[5] - 'A')
)))));
这适用于26 * 10 * 10 * 10 * 26 * 26 = 17576000
,因为它符合int
罚款。
最后简单地哈希这个整数。