Hash技术的总结归纳
在看哈希之前还是来看看“散列函数(哈希函数)”吧,后面会用到的。
解决冲突的方法。
开放定址法。如果h(k)已经被占用,按如下序列探查:
(h(k)+p(1))%TSize, (h(k)+p(2))%TSize, …,(h(k)+p(i))%TSize,…
其中,h(k)为哈希函数,TSize为哈希表长,p(i)为探查函数。
在 h(k)+p(i-1))%TSize的基础上,若发现冲突,
则使用增量 p(i) 进行新的探测,直至无冲突出现为止。
其中,根据探查函数p(i)的不同,开放定址法又分为
(1)线性探查法(p(i) = i : 1 , 2 , 3 , …),
(2)二次探查法(p(i)=(-1)i-1((i+1)/2)2: 12 , -12 , 22 , -22 …),
(3)随机探查法(p(i): 随机数 ),
(4)双散列函数法(双散列函数h(key) ,
hp (key)若h(key)出现冲突,则再使用hp (key)求取散列地址。
探查序列为:h(k), h(k)+ hp(k),…, h(k)+ i*hp(k))。
基本知识
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,
就是把任意长度的输入(又叫做预映射, pre-image),
通过散列算法,变换成固定长度的输出,该输出就是散列值。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,
不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,
它把一些不同长度的信息转化成杂乱的128位的编码,
这些编码值叫做HASH值. 也可以说,
hash就是找到一种数据内容和数据存放地址之间的映射关系
基本概念
* 若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。
由此,不需比较便可直接取得所查记录。
称这个对应关系f为散列函数(Hash function),
按这个思想建立的表为散列表。
* 对不同的关键字可能得到同一散列地址,即key1≠key2,
而f(key1)=f(key2),这种现象称冲突。
具有相同函数值的关键字对该散列函数来说称做同义词。
综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字
映象到一个有限的连续的地址集(区间)上,
并以关键字在地址集中的“象” 作为记录在表中的存储位置,
这种表便称为散列表,这一映象过程称为散列造表或散列,
所得的存储位置称散列地址。
* 若对于关键字集合中的任一个关键字,
经散列函数映象到地址集合中任何一个地址的概率是相等的,
则称此类散列函数为均匀散列函数(Uniform Hash function),
这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
常用的构造散列函数的方法
散列函数能使对一个数据序列的访问过程更加迅速有效,
通过散列函数,数据元素将被更快地定位ǐ
1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。
即H(key)=key或H(key) = a·key + b,
其中a和b为常数(这种散列函数叫做自身函数)
2. 数字分析法
3. 平方取中法
4. 折叠法
5. 随机数法
6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。
即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,
也可在折叠、平方取中等运算之后取模。
对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
处理冲突的方法
1. 开放寻址法;Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),
其中H(key)为散列函数,m为散列表长,di为增量序列,
可有下列三种取法:
1. di=1,2,3,…,m-1,称线性探测再散列;
2. di=1^2,(-1)^2,2^2,(-2)^2,(3)^2,…,±(k)^2,(k<=m/2)称二次探测再散列;
3. di=伪随机数序列,称伪随机探测再散列。==
2. 再散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函数,
即在同义词产生地址冲突时计算另一个散列函数地址,
直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。
3. 链地址法(拉链法)
4. 建立一个公共溢出区
posted on 2011-09-24 10:57 More study needed. 阅读(1821) 评论(0) 编辑 收藏 举报