我试图了解通用哈希是如何工作的。它定义为h(x) = [(a*x + b) mod p] mod m
其中a,b
- 随机数,m
- 哈希表的大小,x
- 键和p
- 素数。例如,我有几个不同的键:
92333
23347
20313
为了创建通用哈希函数,我必须遵循:
Let a = 10, b = 22, p = 313, m = 100
h(92333) = [(10 * 92333 + 22) mod 313] mod 100 = 2 mod 100 = 2
h(23347) = [(10 * 23347 + 22) mod 313] mod 100 = 307 mod 100 = 7
...
但是每次我都会得到0到99范围内的数字并且可能会有很多碰撞。
所以我的问题是:我理解并正确应用了通用哈希?
答案 0 :(得分:1)
但是每次我都会得到0到99范围内的数字并且可能会有很多碰撞。
右。但是你的哈希表只有100个桶,所以如果你试图坚持使用几十个键就不能避免冲突。
你可以期待的最好的是在整个100个桶中均匀地分布冲突,你的哈希函数应该能够粗略地做。这样,在桌子填满之前,你不会遇到很多碰撞,而且碰撞不会让每个碰撞都太多。
如果您想存储更多密钥,则需要将表格放大。
答案 1 :(得分:1)
假设您正在散列的数字具有均匀分布,则您的函数偏向于0到12的存储区。
假设发生直到并包括mod 313
操作的哈希操作。该操作的结果将获得0..312范围内的值。同样,如果此操作的结果是均匀分布的,那么请mod 100
获得以下效果:
result of Occurs for these
mod 100 mod 313 results
----------- ------------------
0 0, 100, 200, 300
1 1, 101, 201, 301
2 2, 102, 202, 302
3 3, 103, 203, 303
4 4, 104, 204, 304
5 5, 105, 205, 305
6 6, 106, 206, 306
7 7, 107, 207, 307
8 8, 108, 208, 308
9 9, 109, 209, 309
10 10, 110, 210, 310
11 11, 111, 211, 311
12 12, 112, 212, 312
13 13, 113, 213
14 14, 114, 214
15 15, 115, 215
请注意在12点之后获得特定结果的机会数量是如何下降的?你有偏见。这里有更多的证据表明从数字0到5,000,000的数字哈希计算结果:
counts[0]: 63898
counts[1]: 63896
counts[2]: 63899
counts[3]: 63900
counts[4]: 63896
counts[5]: 63896
counts[6]: 63900
counts[7]: 63896
counts[8]: 63896
counts[9]: 63900
counts[10]: 63898
counts[11]: 63896
counts[12]: 63899
counts[13]: 47925
counts[14]: 47922
counts[15]: 47922
counts[16]: 47925
... elided similar counts ...
counts[97]: 47922
counts[98]: 47922
counts[99]: 47925