您的位置:首页 > 其它

关于HASH的学习总结

2014-05-02 17:47 218 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Luffy20140918/article/details/84595953 峰哥大概一个星期前给我们这批想做云计算方向的筒子们讲了一堂HASH表的课,然后布置了一篇博客,但是这个星期博主要考试,结果拖到今天才动笔,才学粗浅漏洞略多各位看官见谅(鞠躬)希望能指出错误十分感谢~
百度百科上关于HASH算法的解释是“哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。”在这写一点博主自己的理解吧。博主认为,所谓HASH算法,就是为了减少在大量数据中检索出所需的那个数据的时间,通过一定算法规则,将数据分为若干组,组名即为所谓哈希值,必为整数,每个数据在组里又有各自的编码,这样就可以先大致判断数据范围,判断属于哪个组,再在这个组里检索出所要的数据;就不需要遍历所有的数据来检索,大大缩减了时间增大了效率,个人认为类似数学上的二分法。而这个分组的算法规则即为HASH算法,能够越快检索到所需数据的算法就是较优的算法。而数据通过HASH可以将压缩成一种保密格式。
几种经典的HASH算法有:MD2(面向8位机器)、MD4、MD5 和 SHA-1(32位机器)。简单介绍一下MD5与SHA-1算法。MD5与SHA-1算法类似,区别在于SHA-1要求原始报文长度不得超过2的64次方,后生成160位报文摘要(即HASH值),较为简单较易于实现,但是实现速度略慢。SHA-1与MD5均以512位分组来处理输入信息,MD5每一组又分为16个32位子分组,经过处理后算法输出由四个32位分组组成,并联后将生成128位的报文摘要,而SHA-1则分有5个32位链接变量。如何将数据化成以512位分组来处理呢?首先需要对信息进行填充,在信息后面填充一个1和若干个0,使其位长对512求余结果为448,则位长被拓展为N*512+448,即N*64+56个字节,再在这个结果后附加一个以64位二进制表示的填充前信息的长度,位长变为N*512+448+64=(N+1)*512,长度变为512的整数倍,使得分为16小组后每组32位。
显而易见,相同哈希值的数据可能不止一个,即产生了哈希冲突并且不可避免。处理哈希冲突有4种方法。
1. 开放定值法
这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:Hi=(H(key)+di)%m i=1,2,…,n,其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:
(1) 线性探测再散列
di=1,2,3,…,m-1
这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
(2)二次探测再散列
di=1∧2,-1∧2,2∧2,-2∧2,…,k∧2,-k∧2 ( k<=m/2)
这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
(3)伪随机探测再散列
di=伪随机数序列。
具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。
2. 再哈希法
这种方法是同时构造多个不同的哈希函数:
Hi=RH1(key),i=1,2,3,…,n.
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间
3. 链地址法
简单的说,即将哈希值作为链表,冲突值制为数组队列
将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。链地址法适用于经常进行插入和删除的情况
其只能做删除标记,而不能真正删除节点,因为会影响到之后数据查询。
4. 建立公共溢出区
将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表(即把元素分开两个表来存储)
稍后将补一篇关于一致性HASH的博客(鞠躬)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: