散列表(哈希表)
散列表(Hash Table,也叫作哈希表)是根据数据的关键码值(Key-Value对)对数据进行存取的数据结构。散列表通过映射函数把关键码值映射到表中的一个位置来加快查找。这个映射函数叫作散列函数,存放记录的数组叫作散列表。给定表M,存在函数f(key),对任意给定的关键字key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为散列表,称函数f(key)为散列函数。具体的数据结构如图4-9所示。

散列表算法通过在数据元素的存储位置和它的关键字(可用key表示)之间建立一个确定的对应关系,使每个关键字和散列表中唯一的存储位置相对应。在查找时只需根据这个对应关系找到给定关键字在散列表中的位置即可,真正做到一次查找命中。
常用的构造散列函数如下:
◎ 直接定址法:取关键字或关键字的某个线性函数值为散列地址,即h(key) = key或h(key)= a×key + b,其中a和b为常数。
◎ 平方取值法:取关键字平方后的中间几位为散列地址。
◎ 折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为散列地址。
◎ 除留余数法:取关键字被某个不大于散列表长度m的数p除后所得的余数为散列地址,即h(key) = key /p (p≤m)。
◎ 随机数法:选择一个随机函数,取关键字的随机函数值作为其散列地址,即h(key)=random(key)。
◎ Java HashCode实现:在Java中计算HashCode的公式为f(key) = s[0]× 31n-1+s[1]×31n-2+...+s[n-1]。具体实现如下:

Hash主要用于用信息安全加密和快速查询的应用场景。
◎ 信息安全:Hash主要被用于信息安全领域的加密算法中,它把一些不同长度的信息转化成杂乱的128位编码,这些编码的值叫作Hash值。也可以说,Hash就是找到一种数据内容和数据存放地址之间的映射关系。
◎ 快速查找:散列表,又叫作散列,是一种更加快捷的查找技术。基于列表集合查找的一般做法是从集合中拿出一个元素,看它是否与当前数据相等,如果不相等,则缩小范围,继续查找。而散列表是完全另外一种思路,在知道key值以后,就可以直接计算这个元素在集合中的位置,不需要一次又一次的遍历查找。

浙公网安备 33010602011771号