布隆过滤器是如何工作的

151 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


前文提到过是用布隆过滤器快速判断数据是否存在,从而避免发生缓存穿透的问题,这篇来介绍布隆过滤器的基本原理。

构成一个布隆过滤器的最主要元素是一个很长的位数组和一系列随机应设函数。布隆过滤器可以用于判断一个元素是不是在集合中。它的优点是空间效率和时间效率都远胜于其他类似的算法,缺点是有一定的无识别率,且删除元素比较复杂。

1030776-20170106143141784-1475031003.png.jpeg

上图是布隆过滤器的简单示意图。

布隆过滤器在最初始的状态下,它的位数组的每一个元素都是0。

每当向布隆过滤器中增加一个元素,就会通过布隆过滤器的一系列哈希函数,分别对元素进行哈希运算,使元素能对应到位数组的多个位置,然后将这些位置的值都设置为1,元素就添加完成了。

当给定一个元素,需要通过布隆过滤器查询这个数据是不是在集合中时,同样通过布隆过滤器中的这些哈希函数,分别计算出一个哈希值,对应到位数组的多个位置上,如果这些位置上的值都是1,则判定为数据存在于集合中,否则判定为数据不存在集合中。

从以上描述中可以判断,当布隆过滤器判定一个元素存在的时候,可能存在误判的情况,也就是该元素不在集合中,可能是其对应的数组位置上的1是被其他元素映射到的位置。但是如果布隆过滤器判定一个元素不存在,则它一定不存在。

布隆过滤器除了可以用于防止缓存穿透,还被用于压力邮件识别、敏感词顾虑等。

尽管存在一定的误判率,但是在一些不要求绝对准确性的业务场景中,布隆过滤器的效率相对于其他算法要高得多。