当前位置: 首页 > news >正文

布隆过滤器到底是什么东西?它有什么用

布隆过滤器:用概率换空间的奇妙数据结构

引言:当空间成为奢侈品

在互联网每天产生2.5万亿字节数据的时代,Google每秒处理超过9万次搜索请求,Redis缓存系统支撑着百万级QPS的访问。面对如此海量的数据处理需求,传统的数据结构往往显得力不从心。这时,一种名为布隆过滤器(Bloom Filter)的魔法数据结构应运而生,它用极小的空间代价实现了高效的成员存在性检测,成为现代系统架构中不可或缺的利器。

一、布隆过滤器原理剖析

1.1 数据结构核心组成

布隆过滤器的核心是一个初始全为0的m位二进制向量(位数组),配合k个不同的哈希函数。当插入元素时,每个哈希函数将元素映射到位数组的不同位置,并将这些位置置1。查询时,检查所有哈希函数对应的位是否都为1。

class BloomFilter:def __init__(self, size, hash_count):self.size = size         # 位数组大小self.hash_count = hash_count  # 哈希函数数量self.bit_array = [0] * size

1.2 操作流程详解

插入操作:

  1. 对元素x进行k次不同哈希计算

  2. 将得到的每个位置i (i ∈ [1,k])的bit_array[hi(x)]设为1

查询操作:

  1. 对元素y进行同样的k次哈希

  2. 检查所有k个位置是否都为1

    • 全部为1 → 可能存在(可能假阳性)

    • 任一为0 → 绝对不存在

1.3 数学支撑

误判率公式:

其中:

  • m:位数组大小

  • k:哈希函数数量

  • n:已插入元素数量

最优哈希函数数量:

二、独特优势与应用场景

2.1 性能优势对比

 

2.2 典型应用场景

  1. 爬虫系统去重:Google爬虫使用布隆过滤器记录已抓取URL,避免重复抓取

  2. 缓存穿透防护:Redis在缓存查询前先检查布隆过滤器,拦截不存在key的请求

  3. 分布式系统:Cassandra用布隆过滤器减少磁盘查找操作

  4. 网络安全:恶意网址过滤系统初步筛查

  5. 区块链应用:比特币SPV节点验证交易存在性

三、实现进阶与优化

3.1 参数调优实践

import mathdef optimal_params(n, p):"""计算最优参数:param n: 预期元素数量:param p: 期望误判率:return: (m, k) 位数组大小,哈希函数数量"""m = - (n * math.log(p)) / (math.log(2)**2)k = (m / n) * math.log(2)return round(m), round(k)

3.2 改进型变种

  1. 计数布隆过滤器:每个位改用计数器,支持删除操作

  2. 分层布隆过滤器:使用多个过滤器级联,降低整体误判率

  3. 压缩布隆过滤器:应用压缩算法进一步减少内存占用

四、生产环境最佳实践

4.1 使用场景决策树

 

是否需要存储原始数据?
├── 是 → 使用传统数据结构
└── 否 → 能否接受假阳性?├── 否 → 不可用└── 是 → 是否要求空间最优?├── 是 → 选择布隆过滤器└── 否 → 考虑其他概率结构

4.2 性能优化技巧

  • 使用SIMD指令加速哈希计算

  • 采用双缓冲机制实现无锁更新

  • 组合多个小过滤器代替单一大型过滤器

  • 选择硬件友好的哈希函数(如MurmurHash3)

五、典型应用案例解析

案例:Medium文章推荐系统
Medium使用布隆过滤器实现:

  1. 用户阅读历史记录(防止重复推荐)

  2. 已生成推荐列表去重

  3. 热门文章缓存预热过滤

实现效果:

  • 内存占用减少87%

  • 推荐响应时间降低45%

  • 系统吞吐量提升3.2倍

六、局限性与应对策略

核心限制:

  1. 假阳性概率不可避免

  2. 无法删除元素(基础版本)

  3. 哈希函数性能影响吞吐量

应对方案:

  1. 组合使用LRU缓存消除高频误判

  2. 定期重建过滤器(适用于动态数据集)

  3. 采用可删除变种(Counting Bloom Filter)

结语:平衡的艺术

布隆过滤器向我们展示了计算机科学中永恒的权衡之道——在空间与准确性、性能与可靠性之间寻找最佳平衡点。当处理海量数据时,它就像一位聪明的守门人,虽然偶尔会误放个别访客(假阳性),但能确保不放行任何可疑分子(无假阴性),这种特性使其成为构建高性能系统的秘密武器。理解并善用这种数据结构,将帮助开发者在日益复杂的系统架构中做出更明智的设计决策。

 

相关文章:

布隆过滤器到底是什么东西?它有什么用

布隆过滤器:用概率换空间的奇妙数据结构 引言:当空间成为奢侈品 在互联网每天产生2.5万亿字节数据的时代,Google每秒处理超过9万次搜索请求,Redis缓存系统支撑着百万级QPS的访问。面对如此海量的数据处理需求,传统的…...

【数据结构初阶第十节】队列(详解+附源码)

好久不见。。。别不开心了,听听喜欢的歌吧 必须有为成功付出代价的决心,然后想办法付出这个代价。云边有个稻草人-CSDN博客 目录 一、概念和结构 二、队列的实现 Queue.h Queue.c test.c Relaxing Time! ————————————《有没…...

沪深300股指期权能对股指期货进行完全套保吗?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 沪深300股指期权能对股指期货进行完全套保吗? 沪深300股指期权是以沪深300指数为标的物的期权,而沪深300股指期货则是以该指数作为标的的期货合约。 理…...

JAVA学习第三天

继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别: super父类构造函数的使用: 使用子类构造函数时,都会初始化父类的数据,自动调用父类的无参构造函数 super内存图——007 继…...

win11电脑其他WiFi可以连,只有一个WiFi连不上

这个问题卡了一小会,查了一些资料 后面发现 点击“诊断网络问题” 显示没有响应 第一步 重启wlan网络适配器 解决!!! 重新连接那个有问题的wifi,丝滑连接!...

leetcode_1760 袋子里最少数目的球

1. 题意 给定一个数组,和一个最多次操作次数。每次操作可以将数组中的一个数 x x x分成两个数 t x − t t\quad x-t tx−t。问 m a x O p e r a t i o n C n t maxOperationCnt maxOperationCnt次操作后,数组中最大的数最小的值是多少。 2. 题解 这个…...

Python 面向对象的三大特征

前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…...

Linux下的进程切换与调度

目录 1.进程的优先级 优先级是什么 Linux下优先级的具体做法 优先级的调整为什么要受限 2.Linux下的进程切换 3.Linux下进程的调度 1.进程的优先级 我们在使用计算机的时候,通常会启动多个程序,这些程序最后都会变成进程,但是我们的硬…...

面向对象程序设计-实验六

7-1 函数重载&#xff08;数据类型不同&#xff09; 代码清单&#xff1a; #include<iostream> using namespace std; class axxx { public: void px(int n,int a[]) { for(int i0;i<n;i) { for(int j0;j<n-i-1;j) { int t; if(a[j]>a[j1]) { ta[j]; a[j…...

MongoDB 7 分片副本集升级方案详解(上)

#作者&#xff1a;任少近 文章目录 前言&#xff1a;Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言&#xff1a;Mongodb版本升级 在开始升级之前&#xff0c;请参阅 MongoDB下个版本中的兼容性变更文档&#xff0c;以确保您的应用程序和…...

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35555 漏洞名称&#xff1a;Tenda W6 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1…...

算法分析 ——《模拟》

文章目录 《替换所有的问号》题目描述&#xff1a;代码演示&#xff1a;代码解析&#xff1a; 《提莫攻击》题目描述&#xff1a;代码演示&#xff1a;代码解析&#xff1a; [《Z 字形变换》](https://leetcode.cn/problems/zigzag-conversion/)题目描述&#xff1a;代码演示&a…...

将Sqlite3数据库挂在内存上处理

创作灵感&#xff1a;最近把小学生的口算题从2位数改到3位数&#xff0c;100以内四则运算练习&#xff08;千纬数学&#xff09;再次更新&#xff0c;选取难题-CSDN博客要不断刷题目&#xff0c;以前100以内的加减乘除也是这样刷出来的&#xff0c;代码如下&#xff1a; impor…...

前端大屏适配方案:从设计到实现的全流程指南

引言 随着数据可视化需求的增长&#xff0c;大屏展示项目在前端开发中越来越常见。然而&#xff0c;大屏开发面临独特的挑战&#xff1a; 屏幕分辨率多样&#xff1a;从1080P到4K甚至8K&#xff0c;如何保证清晰度&#xff1f;布局复杂&#xff1a;多图表、多组件如何合理排列…...

学习总结三十二

map #include<iostream> #include<map> using namespace std;int main() {//首先创建一个map对象map<int, char>oneMap;//插入数据oneMap.insert(pair<int, char>(1, A));oneMap.insert(make_pair(2,B));oneMap.insert(map<int,char>::value_ty…...

飞书专栏-TEE文档

CSDN学院课程连接&#xff1a;https://edu.csdn.net/course/detail/39573...

linux 查看设备中的摄像头迅速验证设备号

​ 通常&#xff0c;摄像头在系统中会被识别为/dev/video*设备文件&#xff0c;比如/dev/video0、/dev/video1等。用户可能有多个摄像头&#xff0c;比如内置摄像头和外接USB摄像头&#xff0c;这时候每个摄像头会被分配不同的设备号。 1. 列出所有摄像头设备 方法 1&#xf…...

2.8 企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南

企业级训练数据构造革命:从人工标注到GPT智能标注的工业级实践指南 引言:数据标注——AI模型的基石与瓶颈 据2024年AI行业报告显示,高质量标注数据的获取成本占模型开发总成本的62%,且标注错误导致的模型性能下降可达40%。本文将揭示如何结合大模型能力,构建支持千万级数…...

DeepSeek的蒸馏技术:让模型推理更快

DeepSeek系列模型&#xff0c;如DeepSeek-R1-Distill-Qwen-7B&#xff0c;采用了知识蒸馏&#xff08;Knowledge Distillation&#xff09;技术&#xff0c;这是一种强大的模型压缩和优化方法。通过蒸馏&#xff0c;DeepSeek模型在保持甚至提升性能的同时&#xff0c;实现了更快…...

19.4.6 读写数据库中的二进制数据

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 需要北风数据库的请留言自己的信箱。 北风数据库中&#xff0c;类别表的图片字段在【数据表视图】中显示为Bitmap Image&#xff1…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...