设计一个全域散列函数类的方法如下,该方法中,散列表大小m的大小是任意的。
选择一个足够大的质数p,使得每一个可能的关键字都落在0到p-1的范围内。设Zp表示集合{0, 1, …, p-1},Zp*表示集合{1, 2, …, p-1}。对于任何a∈Zp*和任何b∈Zp,定义散列函数ha,b
ha,b = ((ak+b) mod p) mod m
所有这样的散列函数构成的函数族为:
Hp,m = {ha,b : a∈Zp*和b∈Zp}
由于对a来说有p-1种选择,对于b来说有p种选择,因而,Hp,m中共有p(p-1)个散列函数。
可以证明碰撞发生的概率为1/m。
我给出一个不同于算法导论那本书的证明:
由定理可知碰撞发生可表示为:
ak+b ≡aj+b (mod p) 由于p是素数所以ak≡aj (mod p)推出
可知道当选定k,j的时候,只有一个a的值会发生碰撞,所以当碰撞的时候b可以取任意值即碰撞概率为
因为对足够大的p来说函数趋向1/m,所以发生碰撞的哈希函数概率等于1/m。