布隆过滤器(Bloom Filter)详解

news2024/11/23 18:50:16

一、引言

        在处理大量数据的场景中,我们经常会遇到判断一个元素是否在某个集合中的问题。传统的方法可能是使用 HashMap 等集合将数据保存起来,然后进行比较确定,但在元素很多的情况下,这种方式会非常浪费空间,检索速度也会越来越慢。这时,布隆过滤器(Bloom Filter)应运而生。本文将详细介绍布隆过滤器的原理、使用场景以及优缺点。

二、什么是布隆过滤器

        布隆过滤器是 1970 年由布隆提出的,它实际上是一个很长的二进制向量和一系列随机映射函数组成,主要用于判断一个元素是否在一个集合中。它不存储数据本身,仅存储哈希结果取模运算后的位标记,因此占用内存小,适合海量数据场景。其优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

三、布隆过滤器的原理

数据结构

        布隆过滤器是由很长的二进制向量(即可以理解成很长的 0、1 数组)与一系列随机映射函数(Hash 函数)构成。由于其数据结构仅需要存储 “0” 或 “1”,因此所占用内存极少。

检索和插入原理

Hash 函数简介:Hash 函数就是把输入值通过特定方式处理后生成一个值,这个值等同于存放数据的地址。

插入数据原理

当一个元素加入布隆过滤器中的时候,会进行如下操作:

使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)

根据得到的哈希值,在位数组中把对应下标的值置为 1

如下图所示:

检索数据原理:将待检索元素通过同样的一系列 Hash 函数得到对应的一系列数组地址(索引下标),判断这几个索引下标对应的值是否均为 1,是的话则说明存在,否则不存在。

对给定元素再次进行相同的哈希计算

得到哈希值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值存在布隆过滤器当中,如果存在一个值不为 1,说明该元素不在布隆过滤器中

例如我们查询 “你好” 这个值是否存在,哈希函数返回了 3、5、7三个值

如下图所示:

结果得到三个 1 ,说明 “你好” 是有可能存在的。

元素的删除

        布隆过滤器对元素的删除不太支持,因为不同的值可能经过一系列 Hash 函数后得到的一系列地址,总有可能两个或多个值经过某个 Hash 函数映射后得到其中一个地址会一样,此时数组中对应的下标肯定为 1。

当删除或修改某个元素后,如果将其原来对应地址的值从 1 改为 0,无法确定这个地址是否也对应其他值,可能会导致其他原本存在的值在检索时返回不存在的情况。

四、布隆过滤器的使用场景

区块链中使用布隆过滤器来加快钱包同步;

数据库防止穿库,Google Bigtable,HBase 和 Cassandra 以及 Postgresql 使用BloomFilter来减少不存在的行或列的磁盘查找。避免代价高昂的磁盘查找会大大提高数据库查询操作的性能

判断用户是否阅读过某一个视频或者文章,类似抖音,刷过的视频往下滑动不再刷到,可能会导致一定的误判,但不会让用户看到重复的内容

网页爬虫对URL去重,采用布隆过滤器来对已经爬取过的URL进行存储,这样在进行下一次爬取的时候就可以判断出这个URL是否爬取过了

使用布隆过滤器来做黑名单过滤,针对不同的用户是否存入白名单或者黑名单,虽然有一定的误判,但是在一定程度上还是很好的解决问题

缓存击穿场景,一般判断用户是否在缓存中,如果存在则直接返回结果,不存在则查询数据库,如果来一波冷数据,会导致缓存大量击穿,造成雪崩效应,这时候可以用布隆过滤器当缓存的索引,只有在布隆过滤器中,才去查询缓存,如果没查询到则穿透到数据库查询。如果不在布隆过滤器中,则直接返回,会造成一定程度的误判

WEB拦截器,如果相同请求则拦截,防止重复被攻击。用户第一次请求,将请求参数放入布隆过滤器中,当第二次请求时,先判断请求参数是否被布隆过滤器命中。可以提高缓存命中率。Squid 网页代理缓存服务器在 cache digests 中就使用了布隆过滤器。Google Chrome浏览器使用了布隆过滤器加速安全浏览服务

Google 著名的分布式数据库 Bigtable 使用了布隆过滤器来查找不存在的行或列,以减少磁盘查找的IO次数

Squid 网页代理缓存服务器在 cache digests 中使用了也布隆过滤器

Venti 文档存储系统也采用布隆过滤器来检测先前存储的数据

SPIN 模型检测器也使用布隆过滤器在大规模验证问题时跟踪可达状态空间

Google Chrome浏览器使用了布隆过滤器加速安全浏览服务

五、布隆过滤器的优缺点

  1. 优点

    • 时间复杂度低,增加和查询元素的时间复杂为 O (N),(N 为哈希函数的个数,通常情况比较小)。
    • 保密性强,不存储元素本身。
    • 存储空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如 Set、Map 集合)。
  2. 缺点

    • 有一定的误判率,但是可以通过调整参数来降低。
    • 无法获取元素本身。
    • 很难删除元素。

        布隆过滤器中一个元素如果判断结果为存在的时候元素不一定存在,但是判断结果为不存在的时候则一定不存在。因此,布隆过滤器不适合那些对结果必须精准的应用场景。

六、总结

        布隆过滤器是一种非常实用的数据结构,在处理大规模数据时,能够以较小的内存占用和快速的查询速度判断元素的存在性。虽然存在一定的误判率和删除困难等缺点,但在很多场景下,只要允许一定的误判率,布隆过滤器都是一个非常好的选择。在实际应用中,可以根据具体需求选择合适的实现方式,如 Redis 中的布隆过滤器,以满足不同场景下的需求。

参考连接

一篇吃透布隆过滤器(Bloom Filter)及其使用场景-CSDN博客

Redis-布隆过滤器(Bloom Filter)详解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203409.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dayu_widgets-简介

前言: 越来越多的人开始使用python来做GUI程序,市面上却很少有好的UI控件。即使有也是走的商业收费协议,不敢使用,一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…

Fiddler配合wireshark解密ssl

环境: win11(wireshark)--虚拟机win7(Fiddler)---虚拟机win7(HTTPS站点) 软件安装问题: 需要.net环境,NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…

Pytest测试用例生命周期管理-Fixture

1、Fixture 用法 Fixture 特点及优势 1、命令灵活:对于 setup,teardown,可以不起这两个名字2、数据共享:在 conftest.py 配置⾥写⽅法可以实现数据共享,不需要 import 导⼊。可以跨⽂件共享3、scope 的层次及…

从FastBEV来学习如何做PTQ以及量化

0. 简介 对于深度学习而言,通过模型加速来嵌入进C是非常有意义的,因为本身训练出来的pt文件其实效率比较低下,在讲完BEVDET后,这里我们将以CUDA-FastBEV作为例子,来向读者展示如何去跑CUDA版本的Fast-BEV,…

动态规划算法-路径问题——LCR.166.珠宝的最高价值

1.题目解析 题目来源:LCR.166珠宝的最高价值 原名:剑指offer47.礼物的最大价值 测试用例 2.算法原理 1.状态表示 创建dp表,dp[i][j]表示从最左上角到该目标位置的最大礼物值,代表dp[i][j]的状态 2.状态转移方程 目标位置的最大礼物…

SOMEIP_ETS_178: Subscribe_using_wrong_SOMEIP_MessageID

测试目的: 验证DUT能够拒绝一个SOME/IP头部使用错误消息ID进行服务发现的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个使用错误消息ID的服务发现SubscribeEve…

【livox】雷达初始化成功,但没有点云(已解决)

设备: 一台orin(arm) 接网线,本地ip:192.168.1.6 livox雷达:HAP 雷达初始ip:192.168.1.100 实物如下图: 然后 安装 livox_SDK 和 驱动 livox_ros_driver2 参考 【Livox】安…

通信界的5G-A/F5G-A新技术,你知道多少?

2024年已经过去了一大半,风起云涌的AI浪潮,又发生了不小的变化。 一方面,AI大模型的复杂度不断提升,模型参数持续增加,智算集群的规模也随之增加。万卡级、十万卡级集群,已经逐渐成为训练标配。这对智算网络…

心觉:开发潜意识的详细流程和步骤是什么

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作195/1000天 最近领教了一下潜意识的力量和吸引力法则 我想要一张可以放在榻榻米壁柜上的迷你型的电动升降桌,桌面60cm…

《花100块做个摸鱼小网站! 》第七篇—谁访问了我们的网站?

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → 🐟 摸鱼小网站地址 学代码 → 💻 源码库地址 一、前言 大家好呀,我是summo,最近发生了些事情(被裁员了,在找工作中)导致断更了,非常抱歉。…

基于SpringBoot+Vue+Uniapp汽车保养系统小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而…

写一个代码:打印100~200之间的素数

我们要输出100-200之间的素数,首先我们先得输出100-200之间的数字,一般用于遍历循环的数字要用到for循环,同时在输出的100~200之间的数字进行判断是不是素数,我们知道素数的判断条件在于当一个数字从1开始到自己本身的时候&#x…

Android Framework AMS(03)AMS关键类解读

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉AMS的关键类及其设计理念的解读,主要关注图中下方AMS关键类解读部分即可。这么做的目的是为了后面章节分析AMS时更容易理解…

基于SpringBoot+Vue+Uniapp家具购物小程序的设计与实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而…

MySql外键约束

数据库约束 对储存数据的约束,确保储存数据的准确性 not null(非空约束) 该行不能不存储值,null也不能default 默认约束当没有插入值时,该列就默认插入default给的值unique 唯一约束这个行的数据是唯一的prim…

Spark常用RDD算子:transformation转换算子以及action触发算子

文章目录 1. 算子(方法)介绍2. 常用transformation算子2.1 map 2.2 flatMap2.3 filter2.4 distinct2.6 groupBy2.7 sortBy()2.8 k-v数据[(k,v),(k1,v1)] 3. 常用action算子 1. 算子(方法)介绍 rdd中封装了各种算子方便进行计算&a…

传感器模块编程实践(四)舵机+MPU6050陀螺仪模块融合云台模型

文章目录 一.概要二.实验模型原理1.硬件连接原理框图2.控制原理 三.实验模型控制流程四.云台模型程序五.实验效果视频六.小结 一.概要 云台主要用来固定摄像头。准确地说,云台是一种可以多角度调节的支撑设备,类似于人的脖子可以支撑着脑袋,…

java随机生成数学算式

生成随机数学算式可谓是计算机领域的一个经典的问题, 本文使用JFrame,JButton,JTextField等java图形化工具,生成一个可以随机切换题目,可以实现计时功能的一个图形化界面 源代码展示 randomMath类 package login;import javax.swing.*; import java.awt.*; import java.awt.e…

uniapp 锁屏显示插件 Ba-LockShow(可让vue直接具备锁屏显示能力)

简介 Ba-LockShow 是一款可以直接使uniapp的vue界面在锁屏页展示的插件。 支持使vue直接具备锁屏显示能力支持设置锁屏显示和不显示支持唤醒屏幕 截图展示(仅参考) 支持定制、本地包、源码等,有建议和需要,请点击文章结尾“Unia…

【C++】常用数据结构纲要(简易版)

非静无以成学。——诸葛亮 数据结构概括 1、什么是数据结构呢?2、讲述过的结构2、1、前言2、2、树->二叉树->两种平衡二叉树2、3、单链表->双链表->带有哨兵位的链表 3、B树3、1、概念及图示3、2、B树数据处理3、2、1、查找3、2、2、插入 4、哈希表4、1…