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

浅析布隆过滤器

时间:2022-11-10 12:56:25浏览次数:65  
标签:函数 元素 布隆 哈希 过滤器 散列 浅析

一、什么是 BloomFilter

布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。主要用于判断一个元素是否在一个集合中。

通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间也会呈现线性增长,最终达到瓶颈。同时检索速度也越来越慢。这个时候,布隆过滤器(Bloom Filter)就应运而生。

二、布隆过滤器原理

了解布隆过滤器原理之前,先回顾下 Hash 函数原理。

哈希函数

哈希函数的概念是:将任意大小的输入数据转换成特定大小的输出数据的函数,转换后的数据称为哈希值或哈希编码,也叫散列值。下面是一幅示意图:
image

所有散列函数都有如下基本特性:

  • 如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数
  • 散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同,这种情况称为“散列碰撞(collision)”。

但是用 hash表存储大数据量时,空间效率还是很低,当只有一个 hash 函数时,还很容易发生哈希碰撞。

布隆过滤器数据结构

BloomFilter 是由一个固定大小的二进制向量或者位图(bitmap)和一系列映射函数组成的。

在初始状态时,对于长度为 m 的位数组,它的所有位都被置为0,如下图所示:
image

当有变量被加入集合时,通过 K 个映射函数将这个变量映射成位图中的 K 个点,把它们置为 1(假定有两个变量都通过 3 个映射函数)。
image

查询某个变量的时候我们只要看看这些点是不是都是 1 就可以大概率知道集合中有没有它了

  • 如果这些点有任何一个 0,则被查询变量一定不在;
  • 如果都是 1,则被查询变量很可能存在

为什么说是可能存在,而不是一定存在呢?那是因为映射函数本身就是散列函数,散列函数是会有碰撞的。

误判率

布隆过滤器的误判是指多个输入经过哈希之后在相同的bit位置1了,这样就无法判断究竟是哪个输入产生的,因此误判的根源在于相同的 bit 位被多次映射且置 1。

这种情况也造成了布隆过滤器的删除问题,因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位。如果我们直接删除这一位的话,会影响其他的元素。(比如上图中的第 3 位)

特性

  • 一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在
  • 布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加。

添加与查询元素步骤

添加元素

  1. 将要添加的元素给 k 个哈希函数
  2. 得到对应于位数组上的 k 个位置
  3. 将这k个位置设为 1

查询元素

  1. 将要查询的元素给k个哈希函数
  2. 得到对应于位数组上的k个位置
  3. 如果k个位置有一个为 0,则肯定不在集合中
  4. 如果k个位置全部为 1,则可能在集合中

三、优缺点

优点

相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数 O(K),另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

布隆过滤器可以表示全集,其它任何数据结构都不能;

缺点

但是布隆过滤器的缺点和优点一样明显。误算率是其中之一。随着存入的元素数量增加,误算率随之增加。但是如果元素数量太少,则使用散列表足矣。

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

在降低误算率方面,有不少工作,使得出现了很多布隆过滤器的变种。

参考:布隆过滤器,这一篇给你讲的明明白白-阿里云开发者社区 (aliyun.com)

标签:函数,元素,布隆,哈希,过滤器,散列,浅析
From: https://www.cnblogs.com/lin546/p/16876697.html

相关文章

  • Spring Cloud Alibaba:Gateway之路由过滤器工厂(三)
    前两篇博客已经介绍了十一种路由过滤器工厂:​​SpringCloudAlibaba:Gateway之路由过滤器工厂(一)​​​​SpringCloudAlibaba:Gateway之路由过滤器工厂(二)​​随着​​Gatewa......
  • 浅析深度学习在图像处理中的应用趋势及常见技巧
    导读 图像处理领域是深度学习和机器视觉领域重要的研究分支,本文第一部分将介绍深度学习中图像处理的常用技巧,第二部分则会浅析深度学习中图像处理的主流应用。导言近年以来......
  • 浅析DDD
    什么是DDD软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前,通常需要进行大量的业务知识梳理,而后到达软件设计的层面,最后才是开发......
  • 如何实现数据分析和条件格式过滤器?DevExpress组件可以实现
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专......
  • C# MVC 权限过滤器
    实现需求:验证Token是否有效,重写状态码和返回内容///<summary>///权限过滤器,验证Token是否有效///</summary>///<paramname="filterCo......
  • C# WebApi 权限过滤器
    protectedoverridevoidHandleUnauthorizedRequest(HttpActionContextfilterContext){base.HandleUnauthorizedRequest(filterContext)......
  • 布隆过滤器使用Demo
    实现代码/***@NameBuLongDemo*@Authorqzz*@Date2022/9/717:53*/publicclassBuLongDemo{//预计要插入多少数据privatestaticintsize=1......
  • 系统权限控制AOP和过滤器Filter
    前言在后台管理项目中用户登录后,通过对权限、角色、管理员之间的分配,拥有了不同的权限集合,当用户操作不同类型的功能指令时,根据其权限集合判断该用户是否拥有该权限,如......
  • 谈谈过滤器和拦截器的区别
    一、拦截器和过滤器的区别1、拦截器(Interceptor)只对action请求起作用即对外访问路径而过滤器(Filter)则可以对几乎所有的请求都能起作用包括cssjs等资源文件2、拦......
  • 通用文档信息提取模型浅析
    文章目录​​1.前言与痛点​​​​2.通用信息提取模型技术分析​​​​1.技术介绍​​​​2.原理分析​​​​1.LayoutDetection(视觉检测模块):​​​​2.OCR(文字识别......