哈希表

哈希表 又称散列表,是一种线性存储结构。

哈希表的基本思想:设要存储的对象个数为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种校验并没有抗数据篡改的能力,它们一定程度上能检测出数据传输中的信道误码,但却不能防止对数据的恶意破坏。

MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法。。
(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值