使用hash函数将关键值映射到储存位置。
简单常用的hash函数有:
1.除留余数法:一般选择一个较大的素数做 被除数,直接求余。
2.平方取中法:将关键值平方,然后取 x ^ 2的中间一部分作为哈希结果。
3.折叠法: 将关键值从左到右分为位数相等的几部分,每个部分的位数与哈希表地址的位数相同。折叠的方法有两种 一种是 移位:将各部分的最后一位对齐。分界:s型折叠。。。
4.数据分析法:对于已知数据分析其中数字特性获得一部分均匀的数字分部,取下作为hash结果,这种方法,感觉没太大的意义。
哈希表中冲突是难以避免的,使用两种常用的解决冲突的方法,拉链和开地址。
拉链法:
又称开散列法,又称闭散列法。
拉链法在哈希表中存放的是 哈希结果为对应值的全部元素组成的链表的表头节点,没有成员时为NULL,链表中成员是无序的。
开地址法:
开地址法不扩展空间来储存多余的关键值,而是若哈希结果所在的哈希表中已被占据,则使用一些函数使其寻找一个新的地址来存放结果。
而对于搜索对应hash值的元素时,按照相同的顺序进行查找,若遇到关键值则查找到,若遇到空位置,则表示哈希表中不包含这个值,若又回到起始地址,则表示表已满,且未查到。