1.1.2 Hash与BloomFilter
背景:
- 使用word文档时,word如何判断某个单词是否拼写正确?
- 垃圾邮件过滤算法是如何设计?
- 公安办公时,如何判断嫌疑人是否在网逃名单中?
- 缓存穿透问题如何解决?
上一节介绍了平衡二叉树中的红黑树和B\B+树(草稿丢了不补了)。
平衡二叉树的主要思想:通过比较的方式保证有序,通过每次排除一半元素的方式达到快速索引的目的。
增删改查时间复杂度为:O(log2n)
hash函数
映射函数 Hash(key) = addr
hash函数可能会把两个或两个以上的不同key映射到同一地址,这种情况称之为冲突(或hash碰撞)
选择hash
- 计算速度快
- 强随机分布(等概率,均匀地分布在整个地址空间)
- murmurhash1, murmurhash2, murmurhash3, siphash(redis6.0中使用)
- siphash主要解决字符串相近的强随机分布性(即10000001和10000002hash值也尽量分开)
hash算法不用具体了解,只需要知道如何选择使用哪种就可以
BloomFilter
应用场景:
用于判断某个key一定不存在,同时允许判断有误差的情况
构成:位图 + n个hash函数
由于hash碰撞处理的特性
位图中为0,一定不存在
但是位图中为1,不一定存在(出错概率可以通过设置位图大小来调整)
具体详情:布隆过滤器详解
优点:
- 速度快,通过计算hash函数得到位图坐标(数组)可直接访问
- 强随机
分布式一致性hash
解决了分布式缓存扩容的问题
例子:给2GB的内存,在20亿个整数中找到出现最多的数
通过散列表存储
K整数 4B
V出现次数 4B uint取值范围大于20亿(占4B)
如果全放在内存中:8B*20亿 = 16GB > 2GB 直接处理内存不足
前提:20亿个数据可以称为海量,能够比较符合概率,即不存在类似有一亿的数都一样的情况
步骤一:通过hash的强随机性处理之后,通过取余操作平均分为若干份。
步骤二:在每一份中寻找出出现次数最多的数。
步骤三:在若干份的出现次数最多的数中比较,得出 20亿个整数中出现最多的数