哈希表与哈希(Hash)算法
根据设定的 哈希函数H(key) 和 处理冲突的方法 将一组关键字影像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便成为 哈希表 ,这一映像过程称为哈希造表或 散列 ,所得存储位置称 哈希地址 或 散列地址 。
上面所提到的 哈希函数 是指:有一个对应关系 f ,使得每个关键字和结构中一个唯一的存储位置相对应,这样在查找时,我们不需要像传统的查找算法那样进行比较,而是根据这个对应关系 f 找到给定值K的像 f(K) 。
哈希函数也可叫哈希算法,它可以用于检验信息是否相同( 文件校验 ),或者检验信息的拥有者是否真实( 数字签名 )。
下面分别就哈希函数和处理冲突的方法进行讨论;
构造哈希函数的方法有很多。在介绍各种方法前,首先需要明确什么是“好” 的哈希算法。若对于关键字集合中的任一个关键字,经哈希函数映像到地址集合中任何一个地址的概率是相等的,则称此类哈希函数是 均匀的 (Uniform)哈希函数。换句话说,就是使关键字经过哈希函数得到一个“随机的地址”,以便使一组关键字的哈希地址均匀分布在整个地址区间中,从而减少冲突。
常用的构造哈希函数的方法有:
理论研究表明, 除留余数法的模 p 取不大于表长且最接近表长 m 的素数效果最好,且 p 最好取1.1 n ~ 1.7 n 之间的一个素数(n为存在的数据元素个数) 。
以上便是常用的6种构造哈希函数的方法,实际工作中需视不同的情况采用采用不同的哈希函数,通常考虑的因素有:
前面有提到过 均匀的哈希函数可以减少冲突,但不能避免 ,因此,如何处理冲突是哈希造表不可缺少的另一方面。
通常用的处理冲突的方法有下列几种:
在哈希表上进行查找的过程和哈希建表的过程基本一致。 给定K值,根据建表时设定的哈希函数求得哈希地址,若表中此位置上没有记录,则查找不成功;否则比较关键字,若和给定值相等,则查找成功;否则根据造表时设定的处理冲突的方案找“下一地址” ,直到找到为止。