概念
Hash: 一般译作散列、杂凑,或音译为哈希
常用的hash算法:
- MD4:基于32位操作系统实现。
- MD5:速度比MD4慢一点,但更安全,在抗分析和抗差分方面表现更好。
- SHA-1 :抗穷举(brute-force)性更好,SHA-1 设计时基于和MD4相同原理,并且模仿了该算法
- 其他
散列函数
1.除留余数法 h(K) = K%m
m>n : 素数 (散列表长度)m>n(带散列的数据表长)
参数 | 含义 |
---|---|
K | 关键字 |
m | 散列表的长度 |
n | 带散列的数据表长 |
2. 直接定址法 h(k) = k+e
这样散列地址就是关键字本身,没有冲突发生,若有冲突,则表明关键字错误。
参数 | 含义 |
---|---|
K | 关键字 |
e | 某个数值常量 |
解决冲突的方法
1.线性探测法
方法: 从发生冲突的地方一次查找下一个单元,直到找到一个空闲单元,或探查完所有单元为止。
2.链接法
散列表中每个单元存放相应每个单链表的表头结点,单链表的结点动态分配产生,将发生冲突的结点用单链表连接起来。
举个例子
参数 | 含义 |
---|---|
ASL | 平均查找长度 |
散列存储 散列查找
上图案例使用散列函数为:h(K)=K%5
参数 | 含义 |
---|---|
K: | 代查找关键字 |
h(K): | 散列函数 |
g: | 散列地址(宿主空间下标值) |
散列表 | 散列存储的数组 |
举个例子:
一个集合s={18, 75, 62},散列表 表长为5,散列函数 h(K)=K%5;
h(18) = 18%5 = 3
h(75) = 75%5 = 0
h(62) = 62%5 = 2
若再存储一个关键字 K=13,则散列地址为 h(13) = 13%5 = 3
发现下标为3的单元已被占用,此时发生了冲突
同义词: 不同关键字,具有相同散列地址
同义词冲突: 两个关键字的散列地址相同
冲突的影响因素
1. 装填因子 α
α = n/m
n: 原散列表已存入的数
m: 原散列表空间大小
α 越小,空闲空间比例越大,发生冲突的可能性越小
2. 散列函数
散列函数选择恰当会使散列地址尽可能均匀的分散到散列空间,否则会集中于某一区域,增大冲突的发生
散列函数应用
1. 错误矫正
2. 语音识别
3. 信息安全
- 文件校验
- 数字签名
- 鉴权协议
散列查找总结
优点:
插入和查找的速度相当快
缺点:
- 计算散列地址需要花费时间
- 在散列表中体现不出数据元素之间的逻辑关系
- 占用存储空间多
参考:
https://www.bilibili.com/video/BV1g4411H7Py
https://baike.baidu.com/item/Hash/390310