当前位置: 首页 > 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…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...