在前面讨论的各种结构(线性表、树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上。在顺序查找时,比较的结果为“=”与“≠”两种可能;在折半查找、二叉排序树查找和B-树查找时,比较的结果为“≤”,“="和“>”3种可能。查找的效率依赖于查找过程中所进行的比较次数。
理想的情况是希望不经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f ,使每个关键字和结构中一个惟一的存储位置相对应。因而在查找时,只要根据这个对应关系f找到给定值K的像f(K)。若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此,不需要进行比较便可直接取得所查记录。在此,我们称这个对应关系f为哈希(Hash)函数,按这个思想建立的表为哈希表。
我们可以举一个哈希表的最简单的例子。假设要建立一张全国34个地区的各民族人口统计表,每个地区为一个记录,记录的各数据项为:
显然,可以用一个一维数组C(1..30)来存放这张表,其中C[i]是编号为i的地区的人口情况。编号à便为记录的关键字,由它惟一确定记录的存储位置C[门]。例如:假设北京市的编号为1,则若要查看北京市的各民族人口,只要取出C[1]的记录即可。假如把这个数组看成是哈希表,则哈希函数f(key)=key。然而,很多情况下的哈希函数并不如此简单。可仍以此为例,为了查看方便应以地区名作为关键字。假设地区名以汉语拼音的字符表示,则不能简单地取哈希函数f(key)=key,而是首先要将它们转化为数字,有时还要作些简单的处理。例如我们可以有这样的哈希函数:(1)取关键字中第一个字母在字母表中的序号作为哈希函数。例如:BEIJING的哈希函数值为字母“B”在