深入了解布隆过滤器:数据筛选的利器

简介: 深入了解布隆过滤器:数据筛选的利器

一、什么是布隆过滤器

布隆过滤器(英语:Bloom Filter)是1970年由伯顿·霍华德·布隆(Burton Howard Bloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。


布隆过滤器的特点:


  • 如果布隆过滤器判断元素在集合中存在, 不一定存在.
  • 如果布隆过滤器判断不存在, 则一定不存在.


二、布隆过滤器的原理

当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。


简单来说就是准备一个长度为 m 的位数组并初始化所有元素为 0,用 k 个散列函数对元素进行 k 次散列运算跟 len (m) 取余得到 k 个位置并将 m 中对应位置设置为 1。当布隆过滤器保存的元素越多,被置为 1 的 bit 位也会越来越多,元素 x 即便没有存储过,假设哈希函数映射到位数组的三个位都被其他值设置为 1 了,对于布隆过滤器的机制来讲,元素 x 这个值也是存在的,也就是说布隆过滤器存在一定的误判率。


三、底层数据结构

布隆过滤器由一个BitMap组成。所谓的BitMap,本质上就是一个数组。与寻常数组不同的是,BitMap一个数组元素占一个bit,这一特性决定了BitMap能够极大地节省空间

在位图的场景下使用多个哈希函数来降低冲突即就是布隆过滤器的思想,其最大的特点就是:对一个对象使用多个哈希函数。其查询有个特点,就是即使任何两个元素的哈希值不冲突,查询对象的K个位置的值都是1,查询结果为存在,这个结果也可能是错误的,这就是布隆过滤器的容错率。



使用布隆过滤器可以快速检索是否存在,但是当哈希函数特别多的时候,容错率会增大,因此也要控制哈希函数的个数。计算哈希函数个数的数学公式:哈希函数K=(m/n)*In(2).其中m是bit数组长度,n为要存入对象的个数。【实际上,当哈希函数个数为1,且数组长度足够,布隆过滤器就可以退化成一个位图。位图是只有一个特殊的哈希函数,且没有被压缩长度的布隆过滤器】


四、使用场景

布隆过滤器常见的应用场景如下:

  • 网页爬虫对 URL 去重,避免爬取相同的 URL 地址;
  • 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱;
  • Google Chrome 使用布隆过滤器识别恶意 URL;
  • Medium 使用布隆过滤器避免推荐给用户已经读过的文章;
  • Google BigTable,Apache HBbase 和 Apache Cassandra 使用布隆过滤器减少对不存在的行和列的查找。 除了上述的应用场景之外,布隆过滤器还有一个应用场景就是解决缓存穿透的问题。所谓的缓存穿透就是服务调用方每次都是查询不在缓存中的数据,这样每次服务调用都会到数据库中进行查询,如果这类请求比较多的话,就会导致数据库压力增大,这样缓存就失去了意义。


五、布隆过滤器删除

对于布隆过滤器无法直接删除,但也有带引用计数的布隆过滤器,存的不是0和1,而是一个计数。所有的设计都是一个trade-off(权衡取舍)。


为了解决布隆过滤器不能删除元素的问题,布谷鸟过滤器横空出世。布谷鸟过滤器用更低的空间开销解决了布隆过滤器不能删除元素的问题,做到了更好的效果:


  • 支持动态的添加和删除元素
  • 提供了比传统布隆过滤器更高的查找性能,即使在接近满的情况下(比如空间利用率达到 95% 的时候)
  • 比起商过滤器它更容易实现
  • 如果要求误判率低于3%,它比布隆过滤器有更低的空间开销


相关文章
|
PHP Python
矩阵制度三三复制直销系统模式开发详解 | 矩阵制度三三复制直销系统开发源码demo示例
矩阵制度三三复制模式是一种常见的直销模式,也被称为三三复制模式。该模式限制了前排的数量,只能填满3个位置,奖金则是按照固定的深度来进行领取的。在该模式中,每个参与者都可以推荐其他人加入,如果成功推荐,就可以获得相应的奖金。具体来说,如果推荐一个参与者,可以获得20美元的奖金;如果推荐两个参与者,可以获得10美元的奖金;如果推荐三个参与者,可以获得4美元的奖金。此外,该模式还有一些其他的奖金制度,如培育奖金、扣税等。
|
9月前
|
存储 Linux iOS开发
【Linux】冯诺依曼体系与操作系统理解
本文深入浅出地讲解了计算机体系的两大核心概念:冯诺依曼体系结构与操作系统。冯诺依曼体系作为现代计算机的基础架构,通过中央处理器、存储器和输入输出设备协同工作,解决了硬件性能瓶颈问题。操作系统则是连接硬件与用户的桥梁,管理软硬件资源,提供运行环境。文章还详细解析了操作系统的分类、意义及管理方式,并重点阐述了系统调用的作用,为学习Linux系统编程打下坚实基础。适合希望深入了解计算机原理和技术内幕的读者。
260 1
|
9月前
|
Web App开发 数据采集 前端开发
Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
Python + Chrome 爬虫:如何抓取 AJAX 动态加载数据?
|
10月前
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
301 0
|
存储 人工智能 供应链
区块链技术在供应链金融中的革新应用
区块链技术在供应链金融中的革新应用
1850 20
|
存储 供应链 算法
深入探讨区块链技术在供应链管理中的应用与挑战#### 一、
本文旨在探索区块链技术如何革新传统供应链管理,提升透明度、效率与安全性。通过分析区块链的去中心化特性、共识机制及智能合约等核心技术,结合具体案例,阐述其在减少欺诈风险、优化库存管理、加速交易速度等方面的显著优势。同时,文章也客观分析了当前技术实施面临的成本高昂、标准化缺失等挑战,并提出相应的解决策略,为未来供应链管理的数字化转型提供参考方向。 #### 二、
|
Dubbo 安全 Java
Dubbo想要个网关怎么办?试试整合Spring Cloud Gateway
在以Dubbo框架体系来构建的微服务架构下想要增加API网关,如果不想自研开发的情况下在目前的开源社区中几乎没有找到支持dubbo协议的主流网关,但是Spring Cloud体系下却有两个非常热门的开源API网关可以选择;本文主要介绍如何通过Nacos整合Spring Cloud Gateway与Dubbo服务。
3556 0
Dubbo想要个网关怎么办?试试整合Spring Cloud Gateway
|
设计模式 存储 前端开发
MVVM的优点和缺点
MVVM的优点和缺点
260 0
|
存储 算法 安全
加密解密AES(证件号、手机号)
加密解密AES(证件号、手机号)
Playwright系列(9):如何写断言
Playwright系列(9):如何写断言
1027 0