布隆过滤器(Bloom Filter)详解

一、引言

        在处理大量数据的场景中,我们经常会遇到判断一个元素是否在某个集合中的问题。传统的方法可能是使用 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.mzph.cn/diannao/55921.shtml

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

相关文章

Map的实现类:TreeMap

1.存储结构:红黑树 2.实现了SortedMap接口(是Map的子接口),可以对key自动排序。 3.实例代码:Student类和Demo03 如果出现类转换异常 参考【TreeSet(红黑树)】 package com.map;import java…

使用Git生成SSH密钥教程(附Git常用命令)

一、为什么使用SSH? 使用 Git 的 SSH(安全外壳协议)主要有以下几个原因:1. 安全性:SSH 是一种加密的网络协议,用于在网络中安全地运行网络服务。使用 SSH,所有传输的数据都会被加密&#xff0c…

Lory: 推进大型语言模型训练的新篇章

人工智能咨询培训老师叶梓 转载标明出处 随着模型规模的增长,如何有效训练并利用这些模型成为了一个挑战。陈丹琦团队一项新的研究提出了一种创新的预训练方法——Lory,旨在解决大模型在混合专家(MoE)架构中的可微分性和计算效率…

主机加固的关键要素:服务器防病毒

在数字化浪潮中,网络安全已成为企业不可忽视的一环。尤其是安全运维人员,他们肩负着保护企业数据不受侵害的重任。MCK主机加固解决方案,正是为了应对这一挑战而生。 网络安全的严峻现实 不久前,一家知名企业因勒索病毒攻击而被迫…

2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)

第二步链接: 2024 kali虚拟机安装教程,分两大步骤,图文讲解(2)-CSDN博客 准备工作 1.kali的iso镜像文件 2.VMware Workstation Pro 虚拟机软件 正式开始 1.创建新的虚拟机,勾选自定义(高级…

ssm基于SSM框架的餐馆点餐系统的设计+VUE

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 摘要 I Abstract II 1绪论 1 1.1研究背景与意义 1 1.1.1研究背景 1 1.1.2研究意义 1 1.2国内外研究…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) ,f(m)指代至少有m个位置不合法的方案数。 怎么求? 注意到位置为id,权值为v ,不合法的情况,当且仅当 v idk或 v id-k 因此,我们把每一个位置和权值抽象成点 ,不合法的情况之间连一…

Docker容器简介及部署方法

1.1 Docker简介 Docker之父Solomon Hykes:Docker就好比传统的货运集装箱 2008 年LXC(LinuX Contiainer)发布,但是没有行业标准,兼容性非常差 docker2013年首次发布,由Docker, Inc开发 1.1.1什么是Docker Docker是管理容器的引…

数据结构-LRU缓存(C语言实现)

遇到困难,不必慌张,正是成长的时候,耐心一点! 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…

Java后端面试----某团一面

美团一面 1.介绍一下你的第一个项目 这个就不多说了,主要是根据自己的简历上面的项目进行一个简短的概括使用的技术栈和什么背景解决了什么问题等等。 2.线程安全的类有哪些,平时有使用过哪些,主要解决什么问题 在Java中线程安全的类比如…

vue使用table实现动态数据报表(行合并)

<template><div class"previewTable"><h2>***项目研发数据报告</h2><table id"previewTable" width"100%"><tr><th>项目名称</th><td colspan"6">{{ resultData.proName }}<…

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

一键将表格嵌入ppt作为附件!2个做ppt必知的技巧分享!

怎样把表格作为附件放入ppt&#xff1f; 众所周知&#xff0c;微软推出的Office套件包含了Powerpoint和Excel这两款软件&#xff0c;如果想在Powerpoint中插入表格&#xff0c;且表格数据量比较大&#xff0c;此时最好的呈现方式&#xff0c;是在Excel中来展示这些数据&#x…

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题

【Unity学习笔记】解决疑似升级Win11或使用Unity6导致Unity旧版本无法打开的问题 一句话省流&#xff1a; 确保项目地址没有任何中文&#xff0c;重新申请个许可证&#xff0c;然后该咋就咋&#xff0c;完事。 ——————————————————————————————…

华为云应用侧Android测试APP

05.华为云应用侧Android测试APP 本APP在填写或修改部分参数后能够完成token获取&#xff0c;影子消息读取&#xff0c;命令下发。APP共包含三个界面&#xff1a;主界面获取token、影子消息获取界面、命令下发界面。 实现过程参见&#xff1a;华为云应用侧Android Studio开发-…

企业如何制定适合自己的专利布局策略

在竞争激烈的市场环境中&#xff0c;专利布局对于企业的发展和竞争优势的建立至关重要。以下将分要点解析企业如何制定适合自己的专利布局策略。 1、明确企业的发展战略和市场定位 企业首先需要深入了解自身的长期发展规划和短期业务目标。明确是要通过技术创新来开拓新市场&am…

微服务之间的相互调用的几种常见实现方式对比

目录 微服务之间的相互调用的几种实现方式 一、HTTP HTTP/RESTful API调用工作原理 二、RPC 设计理念与实现方式 协议与传输层 RPC远程调用工作原理 应用场景与性能考量 特点 三、Feign 设计理念与实现方式 协议与传输层 Feign调用的基本流程 Feign调用的工作原理…

python爬虫 - 深入requests模块

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、下载网络文件 &#xff08;一&#xff09;基本步骤 &#xff08;二&…

Windows下MYSQL8.0如何恢复root权限

误操作把root权限清掉导致数据库无法登录&#xff08;确实很难受&#xff09;&#xff0c;在网上找了很多方法&#xff0c;发现没有很行之有效的方法&#xff0c;在多方尝试终于找到了适合敏感宝宝体质的方法。 C:\Users\Administrator>mysql -u root -P3307 ERROR 1045 (2…

数据结构——遍历二叉树

目录 什么是遍历二叉树 根据遍历序列确定二叉树 例题&#xff08;根据先序中序以及后序中序求二叉树&#xff09; 遍历的算法实现 先序遍历 中序遍历 后序遍历 遍历算法的分析 二叉树的层次遍历 二叉树遍历算法的应用 二叉树的建立 复制二叉树 计算二叉树深度 计算二…