哈希表 又称散列表,是一种线性存储结构。
哈希表的基本思想:设要存储的对象个数为n,设置一个长度为m(m>=n)的连续内存单元,以线性表中的每个对象的关键字ki(0=<i<n-1)为自变量,通过一个哈希函数的函数h(ki),把ki映射为内存单元的地址,并把该对象存储在这个内存单元中。h(ki)也称为哈希地址。
哈希冲突:对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2)。具有相同函数值的关键字对该散列函数来说称做同义词,由同义词引起的冲突称为同义词冲突。
根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”, 作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。科学家计算过,当负载因子(load factor)不超过75%,查找效率最高。
哈希函数(哈希算法):
常用构造方法:
1、 直接地址法:
以关键字k本生或关键字加上某个数值常量c作为哈希地址的方法。h(k)=k+c。这种方法简单,当关键字的分布基本连续时,可用直接地址法的哈希函数,否则,若关键字分布不连续将造成内存单元的大量浪费。
2、除留余数法:
用关键字k除以某个不大于哈希表长度m的数p所得的余数作为哈希地址的方法。 h(k)=k%p p应该取不大于m的素数效果最好。
3、数字分析法:
提取关键字中取值教均匀的数字位作为哈希地址的方法。
4、平方取中法:
取关键字平方后的中间几位为哈希地址。
5、折叠法:
将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。
6、随机数法:
选择一个随机函数,取关键字的随机函数值为它的哈希地址,即H(key)=random(key),其中random为随机函数。通常用于关键字长度不等时采用此法。
哈希算法的应用:
(1)文件校验:奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测出数据传输中的信道误码,但却不能防止对数据的恶意破坏。
(2)数字签名: Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。
(2)鉴权协议:又被称挑战--认证模式,在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
冲突处理:
1、开放寻址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法:
1.1. di=1,2,3,…,m-1,称线性探测再散列;
1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)称二次探测再散列;
1.3. di=伪随机数序列,称伪随机探测再散列。
2、拉链法:拉出一个动态链表代替静态顺序存储结构,可以避免哈希函数的冲突,不过缺点就是链表的设计过于麻烦,增加了编程复杂度。此法可以完全避免哈希函数的冲突。
3、多哈希法:设计二种甚至多种哈希函数,可以避免冲突,但是冲突几率还是有的,函数设计的越好或越多都可以将几率降到最低。
4、建域法(建立溢出区):假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。
查找性能:使用哈希表进行查找的效率在各种数据结构里算是比较高的,最好情况是O(1),最坏也是O(n)。
著名哈希算法:
(1)MD4(RFC 1320),
MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。
(2)MD5(RFC 1321),
Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
(3)SHA1
由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
字符串哈希函数:
常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等,参考《常见字符串哈希函数的实现》。
PS:本文参考
1、《数据结构(C语言版)》严蔚敏_吴伟民,清华大学出版社
2、百度百科:哈希表,http://baike.baidu.com/view/329976.htm
3、百度百科:哈希算法,http://baike.baidu.com/view/273836.htm?fromId=1041476