槽总数的选择
关键码范围较小
由于关键码范围比较小,可以使用一个槽总数大于关键码总数的表。直接使用槽的下标作为关键码值,此时,不需要将关键码值作为记录的一部分进行存储。哈希函数可以直接设计成h(K)=K,但是这种情况比较少见
##关键码范围较大
如果可能的关键码范围较大,而同一时间段内存储的记录总数较少时。如果槽数的设计和前者匹配通常意味着空间的浪费,而如果和后者匹配又容易导致冲突
除此之外,如果对关键码值的分布特性不了解,也会使得哈希函数的设计更为困难。如果了解关键码值的分布特性,应对使用一个依赖于分布的哈希函数,避免把一组相关的关键码值映射到表的同一个槽中(例如,如果对英文单词进行哈希,就不应当对第一个字符的值哈希,因为这样很可能使分布不均)
简单的哈希函数
关键码为数值的哈希函数的设计:
**1.取模:**哈希函数的返回值(槽的位置)只依赖于关键码的最低几位,由于这些位的分布可能很差,结果分布也就可能很差
**2.平方取中:**一个很好的用于数值的哈希函数。对于长度为2^r的表,取出平方后结果的中间r位作为槽的位置。由于关键码值的大多数位或者所有位都对结果有所贡献,所有效果很好
关键码为字符串的哈希函数的设计:
3.所有字母ASCII值求和对M取模
冲突解决策略
尽管哈希函数的目标是使冲突最少,但实际上冲突是无法避免的。冲突解决技术可以分为两类:
•开哈希(单链表)法
•闭哈希(