优点
可以提高存储空间的利用率,可以提高数据的查询效率,也可以用作数字签名来保障数据传递的安全性。
数字签名:只有数据的发送者能够产生的一串数字段,别人无法伪造。是将发送者的私钥加密与原文一起传送给接收者。
数字签名是加密的过程,数字签名验证是解密的过程。
常用hash函数
-
直接寻址法
取关键字或者关键字的某一线性函数值为散列地址。 -
数字分析法
找出数字的规律,尽可能利用这些数据来构造冲突几率较小的散列地址。 -
平方取中法
关键字取平方后的中间几位作为散列地址。 -
折叠法
将关键字分为位数相同的几部分,最后一部分可不同,然后取各部分的叠加和(去除进位)作为散列地址。 -
随机数法
选择一个随机函数,把关键字作为随机函数的种子取得的随机值作为散列地址。通常用于关键字长度不统一的情况。 -
除留余数法
取一个小于等于散列表表长的数p,关键字除p后所得的余数为散列地址。
不仅可以对关键字直接取模,也可以在折叠,平方取中等运算后取模。
对p的选择很重要,选不好会碰撞的。
处理冲突方法
-
开放寻址法
Hi=(H(key)+di) MOD m, i=1,2,…,k(k<=m-1
H(key)是散列函数,m是散列表长,di是增量序列
di的取法:
1.di=1,2,…,m-1 线性探测再散列
2.di=12,-12,22,-22,…,±k^2(k<=m/2) 二次探测再散列
3.di=伪随机数序列 伪随机探测再散列 -
再散列法
Hi=RHi(key), i=1,2,…,k R Hi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数的地址,直到冲突不再发生,这种方法不易产生“聚集”,但是增加了计算时间。 -
链地址法(拉链法)
-
建立一个公共溢出区
影响产生冲突多少的三个因素
1.散列函数是否均匀
2.处理冲突的方法
3.散列表的装填因子(散列表的装填因子定义为:α(散列表装满程度的标志因子)=填入表中的元素个数 / 散列表的长度)
常用的Hash算法
MD4 基于32位操作数的位操作来实现的
MD5 较MD4更复杂,速度更慢一点,但是更安全,抗分析跟抗差分方面表现更好。
SHA-1 对长度小于2^64的输入产生160bit的散列值,抗穷举性更好。
散列函数的应用
一个设计优秀的加密散列函数是一个“单向”操作,对于给定的散列值,没有实用的方法可以计算出原始输入,也就是说很难伪造。
MD5是为加密散列设计的函数。
-
错误校正
将散列函数的计算结果同原始数据一同发送,接收方将数据通过散列函数计算,比较结果是否一致,不一致则说明传输过程发生了错误,这叫做冗余校验。 -
语音识别
-
信息安全
(1)文件校验
校验算法:奇偶校验,CRC校验,但是这两种校验算法没有抗数据篡改的能力,一定程度上可以检验并校正传输中的信道误码,但是不可以防止对数据的恶意破坏。
(2)数字签名
非对称算法运算的速度较慢
(3)鉴权协议