一、哈希的定义
1.散列技术(哈希):使数据值本身(关键字)与存储位置存在一种映射的关系(f),当需要查找此数据,只需要根据映射关系计算出存储位置并查看即可。
存储位置=f(关键字),其中f称为散列函数,又称哈希函数。
2.哈希是一种存储的方法,也是一种查找方法,查找的速度很快。
二、构造哈希函数的6种方法
1.除留余数法(最常用)
f(key)=key mod p(p<=散列表长度)
2.平方取中法
对关键字进行平方,然后取平方后结果的中间值作为散列的地址。
3.随机数法
f(key)= random(key) 调用随机函数得到散列地址。
4.折叠法
先将关键字从左到右分割成位数相同的几部分,然后将这几部分叠加求和,按散列表的表长,取后几位作为散列的地址。
5.数字分析法
通过对数字的分析,找到真正能够标识的数字作为散列地址。
6.直接定址法
取关键字的某个线性函数值作为散列地址。
三、哈希冲突
1.理解
对于不同的关键码,通过哈希函数后,得到的散列地址相同。则表明发生了哈希冲突
2.解决哈希冲突的4种方法
2.1 开放地址法
发生冲突之后,去寻找下一个空的散列地址,并将值存入。
fi(key)=(f(key)+di) mod p(p<=散列表长度),其中di=1,2,3.........p-1。
此外,还有二次探测法(既向左探测也向右探测,探测幅度为平方(目的:不让关键字聚集在某一块区域))和随机探测法。
2.2 再散列函数法
事先准备多个散列函数,当发生冲突时,更换一个散列函数计算,直到解决冲突。
2.3 链地址法
(1)理解
发生冲突后,不更改位置,而是采用链表的形式,将关键字为同义词(经过哈希函数得到的结果相同的关键字)的存储在单链表中。散列表中只存储同义词的头指针。
如图所示:
2.4 公共区溢出法
通过哈希函数进行计算,将未发生冲突的,存放在对应的位置。这些未发生冲突的构成一个表,称为基本表(快速查找)。对于发生冲突的,将其放在另外一个表中,称为溢出表(一个个查找)。
如果要查找一个值,可以通过计算在基本表中对应位置直接查找,假设未在基本表中找到,则要在溢出表中按顺序依次查找。
四、一致性哈希和虚拟结点
1.原理
一致性哈希是一种分布式系统中用于解决数据分片和负载均衡的技术。
核心在于将数据和服务器映射到同一个哈希环上。
当服务器数量发生变化时,对于传统的哈希方法而言,会使大规模数据迁移。而采用一致性哈希,能够尽可能地减少数据迁移量,从而提升系统的稳定性和可用性。一致性哈希通过虚拟节点技术进一步提高了负载均衡的均匀性。
2.理解
五、布隆过滤器
1.理解
布隆过滤器是一种空间效率极高的概率数据结构,用于判断一个元素是否属于一个集合。
布隆过滤器=一个很长的二进制矢量数组+一组哈希函数。
2.优缺点
2.1 优点
①简单、高效
②占用的空间小
③数据保密性好
④确定不存在,则一定不存在。
2.2 缺点
①存在一定的误判率:确定存在,则可能存在也可能不存在。
②只能插入数据,不能删除数据。