散列方法
哈系表有 m 个槽,如何将关键字 key 散列到哈系表的槽中呢?
除法散列方法
散列结果由下列散列函数决定:
hash(key) mod m
其中 m 是 hash 表的大小,注意 m 的选择:
(1) m 不应是 2 的幂。原因分析如下:
散列的发散程度取决于 hash(key) mod m 的分布范围,
假设 m = 2^p, 对 m 取余,结果等于哈系值中二进制的最低 p 位,
如果哈希值最低 p 位的排列很相似,则 hash(key) mod m 的分布
范围很小,关键字的发散程度就不够好。
(2) 经验表明, 取 m 为与 2 的整数幂不太接近的素数。
可以选择与 [ 2^p + 2^(p+1) ] /2 最接近的一个素数。
一个经典的哈系函数
不断地乘以 33, 至于为什么选择 33, 还没足够充分的解释,经验所得。
unsigned long hash(unsigned char *str)
{
unsigned long value = 5381;
unsigned char *p;
for (p = str; *p; p++) {
value = (value << 5) + value + *p;
}
return value;
}