符号表
我们使用符号表这个词来描述一张抽象的表格,我们会将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。
符号表有时也被称为字典。键就是单词,值就是单词对应的定义,发音和词源。
符号表有时又叫做索引。键就是术语,值就是书中该术语出现的所有页码。
- 无序符号表(HashMap)
- 有序符号表(TreeMap)
- 哈希表概述
如果所有的键都是小整数,我们可以用一个数组来实现的符号表,将键作为数组的索引,而数组中对应的位置存储键关联的值。
哈希表是这种简单方法的扩展,并且能够处理更加复杂类型的键。我们需要用哈希函数将键转换成数组的索引。
哈希表的核心算法可以分为两步。
用哈希函数将键转换为数组中的一个索引。理想情况下不同的键都能转换成不同的索引值。当然这只是理想情况下,所以我们需要处理两个或者多个键都散列到相同索引值的情况 (哈希碰撞)。
处理碰撞冲突。
a. 开放地址法
线性探测法, 平方探测法, 再散列法…
b. 拉链法
哈希函数
一个优秀的 hash 算法,满足以下特点:
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
我们可以简单地把哈希函数理解为在模拟随机映射,然后从随机映射的角度去理解哈希函数。
经典的哈希函数
- MD4: 128位,MD4已被证明不够安全。
- MD5:MD5 已被证明不具备"强抗碰撞性"。
- SHA1:SHA-1 已被证明不具"强抗碰撞性"。
- SHA2:
- SHA3: 相关算法已经被提出。