关于hash
hash函数
映射函数Hash(key)=addr;hash函数可能会把两个或两个以上的不同key映射到同一地址,这种情况称之为冲突(或者hash碰撞);
hash特点及其种类
- 计算速度快
- 强随机分布(等概率、均匀地分布在整个地址空间)
- murmurhash1,murmurhash2,murmurhash3,siphash(redis6.0当中使⽤,rust等大多数、语言选用的hash算法来实现hashmap)
- siphash主要解决字符串接近的强随机分布性;
关于hash的负载因子
- 数组存储元素的个数/数据长度;用来形容散列表的存储密度;负载因子越小,冲突越小,负载因子越大,冲突越大;
关于hash的冲突处理
- 链表法:
- 开放寻址法:具体详解
布隆过滤器
原理:
布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在
或者可能存在;
布隆过滤器不存储具体数据,所以占用空间小,查询结果存在误差,但是误差可控,同时不支持删除操作;
如图,str1和str2均经过过滤器。当一个元素插入时会经过k个hash函数映射到k个槽位中,如果查询到某个槽位的值为0,则可以肯定不存在这个值;如果全部均为1则可能存在,这是因为我们不知道这个被映射的槽位是否是要查询的那个str映射出来的(如str1和str2均映射了第六个)
应用场景
在这里需要理解这四个关系变量:
其中最重要的变量关系为p:k之间的关系;
其在k=31时p最小,究其原因是因为31质数,hash随机分布性是最好的,所以这时候假阳率p最低,即冲突的可能性也最低。
分布式一致性hash
背景
应用场景
分布式缓存;将数据均衡地分散在不同的服务器当中,用来分摊缓存服务器的压力;
解决缓存服务器数量变化尽量不影响缓存失效;
hash偏移
hash算法得到的结果是随机的,不能保证服务器节点均匀分布在哈希环上;分布不均匀造成请求
访问不均匀,服务器承受的压力不均匀;
虚拟节点
- 为了解决哈希偏移的问题,增加了虚拟节点的概念;理论上,哈希环上节点数越多,数据分布越均衡;
- 为每个服务节点计算多个哈希节点(虚拟节点);
更多参考