除余法
hash(key) = key % M
M为素数时,数据对散列表的覆盖最充分,分布最均匀
MAD法
除余法的缺陷:
1)不动点:无论表长M取值如何,总有hash(0) = 0
2)零阶均匀:[0,R)的关键码,平均分配至M个桶;但相邻关键码的散列地址也必相邻
一阶均匀:邻近的关键码,散列地址不再邻近
MAD = multiply-add-divide
取M为素数,a>0,b>0,a%M != 0
hash(key) = ( a * key + b )%M
特定场合下,未必需要高阶的均匀性
数字分析
抽取key中的某几位,构成地址。比如,取十进制表示的奇数位,hash(12345) = 135
平方取中
取key^2的中间若干位,构成地址。比如,hash(123) = 512 // 123^2 = 15129
折叠法
将key分割成等宽的若干段,取其总和作为地址。比如hash(123456789) = 1368 //123+456+789
位异或法
将key分割成等宽的二进制段,经异或运算得到地址。比如hash(110011011) = 110 //110 ^ 011 ^ 011
(伪)随机数法
(伪)随机数发生器
循环:rand(x+1) = [ a * rand(x) ] % M
径取:hash(key) = rand(key) = [rand(0) * a^key] % M
种子:rand(0) = ?
(伪)随机数发生器的实现,因具体平台、不同历史版本而异,创建的散列表可移植性差