普遍的哈希误解

时间:2014-10-08 05:51:27

标签: algorithm hash universal-hashing

我试图了解通用哈希是如何工作的。它定义为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范围内的数字并且可能会有很多碰撞。

所以我的问题是:我理解并正确应用了通用哈希?

2 个答案:

答案 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