布隆过滤器原理及缺点

109 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

说点啥

  • 之前我们介绍了redis为什么那么快,有介绍了布隆过滤器这个高级的东东,废了我好大时间。今天我们来看看他的实现原理,正好解释下上文为什么说他不能删除呢?

原理

image.png

  • 每一个key都会被3次甚至多次hash , 每一次都会将hash值存储到对应的hash中,如 nihao 就分别存储了 1 ,4 ,8 , 这是啥意思呢? 就是说如果 1 , 4 ,8 三个槽都没有值,那么就说明 nihao 肯定没有存储过,因为他三次hash 肯定都回存储的。

image.png

  • 在然后 下载我们引入了baga 这个单词 , 发现他的三次hash 分别是 1,5,7 . 你会发现nihao 和 baga都出现了 1 这个hash值, 如果你检测到 1 存在内容,那么请问你他到底是 nihao的还是 baga的呢?这时候就出现了无法确定的局面,所以说布隆过滤器无法确定元素是否一定存在, 但是可以确定元素一定不存在。

Hash

  • 原理是清楚了,但是为了能够避免 Hash 冲突,我们最好还是能够完善Hash算法尽量减少Hash冲突。而且布隆过滤器如果长度过于小,那么再好的Hash算法也无法避免冲突,在这种极限状态下就会导致一个很无语的问题,一旦布隆过滤器打满, 那么你查询任何数据都有可能是该数据有可能存在的结果,那么布隆过滤器将失去原本的意义。所以好的Hash算法加上适当长度的布隆过滤器才能发挥出来优势
  • 常见的策略有,利用布隆过滤器减少磁盘 IO 或者网络请求,正常情况下判断一个元素是否存在,然后再决定是否进行业务处理,这样一套操作下来能够提升心梗。使用布隆过滤器来加速查找和判断是否存在,那么性能很低的哈希函数不是个好选择,推荐 MurmurHash、Fnv 这些。