Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 普遍散列误解_Algorithm_Hash_Universal Hashing - Fatal编程技术网

Algorithm 普遍散列误解

Algorithm 普遍散列误解,algorithm,hash,universal-hashing,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

我试图理解通用哈希是如何工作的。它被定义为
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到99之间,可能会有很多碰撞

对。但是您的哈希表只有100个bucket,所以如果您尝试插入几十个以上的键,就无法避免冲突

您所能期望的最好方法是将冲突均匀地分布在整个一百个桶中,您的哈希函数应该能够大致做到这一点。这样,在表填满之前,您不会遇到很多冲突,并且冲突不会涉及太多的各方


如果要存储更多的键,则需要将表变大。

假设正在散列的数字具有均匀分布,则函数偏向于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到5000000的散列结果得出的这种影响的更多证据:

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

为什么数字在2到10之间?应该在0到99之间,所以我必须拿m=100万为例?我也应该改变p,a,b吗?取决于你想做什么。一个有一百万个存储桶的哈希表需要的存储空间是一个有一百个存储桶的哈希表的一万倍。我有点误解了。所以为了解决这个问题,我必须取非常大的p,a,b?我不确定我能不能就如何最好地选择散列函数的各种参数给出建议。此外,我在互联网上找到的讲座似乎没有对您正在讨论的“MAD”(乘法、加法、除法)哈希压缩函数给出太多建议或分析。那太令人失望了。我所知道的是,你们的数据似乎表明了这种偏见。