首页 > 其他分享 >浅析布隆过滤器

浅析布隆过滤器

时间:2023-06-19 22:44:49浏览次数:48  
标签:误判 元素 布隆 集合 哈希 过滤器 浅析

最后更新时间 2021-10-05.

布隆过滤器 (Bloom Filter) 是 1970 年由布隆提出的。它可以检索一个元素是否存在于集合中。它的优点是空间效率高,查询时间极快,缺点是有一定的误判率,而且删除困难。

1. 背景

编程中,经常会有判断一个元素是否存在一个集合中:

  • 网络爬虫程序:判断一个地址是否被访问过;
  • 文字处理软件:检查单词的拼写 (也就是判断它是否存在词典里);
  • 电子邮件黑名单。

其中,最直接的办法是,将集合所有元素存储起来,判断时与集合中的元素比较即可。

一般来说会使用哈希表来存储集合,速度快效率高,可以在 O(1) 的时间复杂度返回结果。但是哈希表本身由于负载因子的存在,不可能用满,也就是会有空间浪费的问题,对于网络爬虫来说,可能会处理几十亿的 URL 链接集合,哈希表占据的内存大小是非常可观的。

2. 原理

布隆过滤器,实际上是由一个很长的 bit 向量和一系列的随机映射函数构成的。

它的原理是,当集合新增元素时,通过 K 个哈希函数将该元素映射为多个哈希值,并对每个生成的哈希值对应的 bit 位置为 1。

举个例子,针对 张三 使用 3 个哈希函数,生成了 3 个哈希值 1、5、7,设置对应的 bit 位后如下图所示:

^-------------------------------^
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---------------------------------
| 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
v-------------------------------v

同样,也对 李四 使用 3 个哈希函数,生成了 3 个哈希值 2、3、7:

^-------------------------------^
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---------------------------------
| 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
v-------------------------------v

要判断 钱五 是不是在集合里,计算哈希值 5、6、7,显然不在。

特别注意的是,对张三、李四、钱五都生成了相同的哈希值 7,所以布隆过滤器是会误判的。

以检测一个可疑电子邮件地址是否存在黑名单为例:

布隆过滤器绝对不会漏掉任何一个存在黑名单的电子邮箱地址,但它可能将不在黑名单中的电子邮箱误判。补救方法是建立一个白名单,将可能误判的电子邮箱地址保存起来。

3. 优点

  1. 存储空间,插入时间,查询时间均为常数 O(k);
  2. K 个哈希函数之间并无关联,方便硬件并行实现;
  3. 不需要存储原始元素,有利于数据保密。

4. 缺点

  1. 存在一定的误判率:这个很容易理解,因为不能保证不同元素通过哈希函数的计算后,得到不同的哈希值;
  2. 删除元素困难:这个也不难理解,多个元素计算后,可能会共用同一个 1,如果删除元素将其置 0,会导致其他元素出错。

引用维基百科的解释:

一般情况下不能从布隆过滤器中删除元素。
我们很容易想到把位数组变成整数数组,每插入一个元素相应的计数器加 1,这样删除元素时将计数器减掉就可以了。
然而要保证安全地删除元素并非如此简单。
首先我们必须保证删除的元素的确在布隆过滤器里面。
这一点单凭这个过滤器是无法保证的。
另外计数器回绕也会造成问题。

False positives 概率推导:https://www.cnblogs.com/liyulong1982/p/6013002.html

关于如何选择哈希函数个数和布隆过滤器长度,有一个公式,可以根据业务情况,在误断率和内存空间权衡:

m = - (n * ln p) / (ln 2) ^ 2, k = m * ln * 2 / n

其中,k 为哈希函数个数,m 为布隆过滤器长度,n 为插入的元素个数,p 为误断率。

5. 实现

网上有个 Golang 版,有时间的话写个 PHP 版,不过 PHP 处理二进制真心不爽……


文章来源于本人博客,发布于 2018-06-02,原文链接:https://imlht.com/archives/150/

标签:误判,元素,布隆,集合,哈希,过滤器,浅析
From: https://www.cnblogs.com/lofanmi/p/17492433.html

相关文章

  • 浅析开源容器标准——OCI
    1、导语容器技术火起来了以后,Docker的容器镜像和容器运行时已然成为行业的标准。此后,为了推进容器生态的健康发展。在Linux基金会的主导下,Docker和各大云厂商Google,Amazon,CloudFoundary,Microsoft积极响应于2015年成立了"OpenContainerInitiative",旨在主导容器的生态发......
  • 浅析GPU架构与异构计算CUDA
      下图有几个重点的元素,也是我们下文重点要阐述的概念,绿色代表的是computationalunits(可计算单元)或者称之为cores(核心),橙色代表memories(内存),黄色代表的是controlunits(控制单元)。  因此想要理解GPU的底层核心构成,就必须明确这几个元素的作用,下文会逐一讲解每个元素的......
  • Android Framework层——App启动过程浅析
    1.关于Android系统的启动系统的启动过程非常复杂,这里只是简单的了解。先上谷歌提供的架构分层图⬇**引导程序BootLoader进行初始化Linux内核->启动init进程->init进程fork出zygote进程(处于c++framework层)->zygote进程fork出system_server进程(处于javaframework层)**system_ser......
  • 【Linux交换分区】 交换分区格式浅析
    完成本文,使用了两个工具 1.strace 2.googlecodesearch. ----swap分区有一个大小为PAGE_SIZE的页面,称为signature页,上面记录swap分区的基本信息。staticstructswap_header_v1{charbootbits[1024];/*Spacefordisklabeletc.*/unsig......
  • 全局过滤器------GlobalFilter
    前言SpringCloud的网关提供了31中过滤器,但这些过滤器作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑就需要用到全局过滤器。全局过滤器作用全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理......
  • springboot注册过滤器
    springboot注册过滤器需要使用过滤器的话,优先选择拦截器。因为拦截器符合aop思想。在springboot中使用过滤器有三种方式。分别如下方式一:传统web在传统javaweb、ssm中使用过滤器差不多类似,这里以java配置为例,实现Filter接口@WebFilter("/*")publicclassMyFilter01i......
  • 武汉星起航电子商务有限公司浅析全球电商市场发展趋势
    随着科技的不断进步和全球数字化的推动,全球电商市场正以惊人的速度增长和演变。以下是星起航整理的全球电商市场可能面临的一些发展趋势:移动端购物的持续增长:移动设备的普及和用户对便捷购物体验的需求推动了移动端购物的迅速增长。随着智能手机和平板电脑的普及,越来越多的消费者......
  • Vue全局过滤器的使用以及在template三元运算符中内使用过滤
    新建filters.js如下,内容过滤可以自己写函数,记得export导出importdayjsfrom"dayjs";//转小写letlower=value=>value.toLowerCase();//转大写letupper=value=>value.toUpperCase();letcurrencyStyle=(value,style)=>{//货币格式/***sty......
  • HTTP请求:requests的进阶使用方法浅析
    1背景上篇文章讲解了requests模块的基础使用,其中有get、put、post等多种请求方式,使用data、json等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers、cookies,以及对请求响应的处理方法。接下来讲解一下requests的高级用法。2进阶方法举例2.1requests.request......
  • 浅析微信小程序自动化部署miniprogram-ci介绍及实际使用
    一、miniprogram-ci介绍1、miniprogram-ci简介miniprogram-ci是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。开发者可不打开小程序开发者工具,独立使用miniprogram-ci进行小程序代码的上传、预览等操作。文档:https://www.npmjs.com/package/min......