热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

何为布隆过滤器

问题的提出我们有一个不安全网页的黑名单,包含了100亿个黑名单网页的URL,每个网页URL最多占用64B.。现在我们要设计一个网页过滤系统,这个系统

问题的提出

我们有一个不安全网页的黑名单,包含了100亿个黑名单网页的URL,每个网页URL最多占用64B.。

现在我们要设计一个网页过滤系统,这个系统要判断该网页是否在黑名单里,但是我们的空间有限,只有30GB.

允许有万分之一的判断失误


布隆过滤器

我们可以把所有的URL保存起来,比如放到hashmap里,但是64B*100亿=640GB,不符合要求。

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

如果遇到网页黑名单系统、垃圾邮件过滤、爬虫网址判重等问题,如果可以容忍一定程度的失误率,那么我们就可以用布隆过滤器来解决。


哈希函数

我们先来认识一下哈希函数(或者说是复习)

1)

哈希函数的输入可以认为是无穷大或者是非常大的范围,比如任意一个整数(字符串),而输出域是有范围的

(这就意味着不同的输入可能是相同的输出)

2)

当输入相同的值时,返回值也相同(确定性)

3)

所有不同的输入值得到的输出,均匀地分布在输出域内,并且与输入值出现的规律无关。(这也是评价一个哈希函数是否优秀的两个重要标准)比如:1和2相差很近,但是经过优秀的哈希函数计算后,他们应该差距较大。

4)

速度快:可以认为哈希函数的计算时间是O(1)的。


布隆过滤器输入

下面就开始介绍布隆过滤器啦。

1)

我们准备k个哈希函数,并且他们之间没有什么关系,彼此独立。

那么对于同一个输入对象(你想的没错就是一个URL),经过计算出来的结果也是完全独立的没有规律的。

2)

我们准备一个数组,长度为m,只有两种状态,所以我们选用bit数组名为bitmap。

3)

我们输入一个黑名单里的URL时:把URL用每一个哈希函数计算出来,结果%数组长度(目的是能存下呀。。。。。),把对应位置的bit变为1,记录下来。

处理完所有URL,我们的布隆过滤器就准备好啦。


布隆过滤器检查

我们如何用布隆过滤器检查某个URL是否是黑名单中的呢?
同样的方法,把这个值用k个哈希函数算出结果,每一个结果都去bitmap里找有没有存在过,只要有一个结果不存在,那这个URL就肯定不是黑名单了。(因为之前用同样的方法,bitmap变为1的那些位置和现在应该是一样的)

接下来就是比较佛性的事了,既然有一个答案不存在,这个URL就不是黑名单里的,那。。。所有答案都存在,就能确定它在黑名单里吗?

不是的。

因为可能是其它URL算出的答案恰好把本URL的答案全都算出来过。

想到这就不禁要问了:那这个数据结构有啥用?不是坑爹呢?

其实是有用的,他的失误率是很低很低的。

他的原则就是:“宁可错杀三千,不可放过一个”


如何设计空间和哈希函数

 

首先我们应该想到:数组太小的话肯定是不准确的,比如:

就这么小个数组,存了几个URL,十个地方全算出来过,全成1了。

那后面判断的时候就比较坑了,随便来什么URL,随便什么哈希函数,算出的答案全都出现过,这显然不是我们想要的。

所以,我们应该知道,数组过小会影响准确性。

那么我们如何根据数据量来设计数组大小和哈希函数个数呢?

以本题为例:

样本数:100亿

失误率:不超过0.01%,记为p

每个样本大小:64B(这个其实不影响布隆过滤器大小,因为这是和哈希函数有关的,一般的哈希函数都能接受64B的数据,并且输出,bitmap只需记录答案是否出现过即可)

布隆过滤器大小m由以下公式决定:

根据公式算出m=19.19n,向上取整20,所以需要2000亿bit=25GB

哈希函数的个数由以下公式决定:

k=14

布隆过滤器的失误率为:

计算出为0.006%,符合要求,此题可解。


公式分析

 


白名单

过滤器会用错误,对已经发现的错误样本可以建立白名单防止错误。


其他使用场景


  • 网页爬虫对URL的去重,避免爬去相同的URL地址
  • 垃圾邮件过滤,从数十亿个垃圾邮件列表中判断某邮箱是否是杀垃圾邮箱
  • 解决数据库缓存击穿,黑客攻击服务器时,会构建大量不存在于缓存中的key向服务器发起请求,在数据量足够大的时候,频繁的数据库查询会导致挂机。

推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 如何使用代理服务器进行网页抓取?
    本文介绍了如何使用代理服务器进行网页抓取,并探讨了数据驱动对竞争优势的重要性。通过网页抓取,企业可以快速获取并分析大量与需求相关的数据,从而制定营销战略。同时,网页抓取还可以帮助电子商务公司在竞争对手的网站上下载数百页的有用数据,提高销售增长和毛利率。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
木又的思念_740
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有