布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,主要用于判断一个元素是否可能属于某个集合。它的基本原理是利用位数组(Bitmap)和一组哈希函数来实现快速且近似的存在性查询。

一、布隆过滤的工作原理

  1. 初始化时,位数组的所有位都被设置为0。位数组的最大长度是2的32次方,大约42亿

  2. 当要插入一个元素时,使用预先设定好的多个独立、均匀分布的哈希函数对元素进行哈希运算,每个哈希函数都会计算出一个位数组的索引位置。

  3. 将通过哈希运算得到的每个索引位置的位设置为1。

  4. 查询一个元素是否存在时,同样用相同的哈希函数对该元素进行运算,并检查对应位数组的位置是否都是1。如果所有位都为1,则认为该元素可能存在于集合中(小概率存在hash碰撞);如果有任何一个位为0,则可以确定该元素肯定不在集合中。

  5. 由于哈希碰撞的存在,当多位同时为1时,可能出现误报(False Positive),即报告元素可能在集合中。

(所以布隆过滤器是有一定的误杀概率的,但是可以通过增加hash次数,降低hash碰撞的概率,来降低布隆的误杀率)

二、布隆过滤器的优缺点

优点:

  1. 空间效率高:相比于精确存储所有元素的数据结构,布隆过滤器所需的内存空间小得多。

布隆过滤器占用空间计算:

2的32次方=4294967296(字节)

1GB = 1024*1024 *1024 = 1073741824(字节)

所以单个布隆过滤的最大存储大约是4GB,存放42亿点位的数据

  1. 查询速度快:只需要执行几个哈希函数并检查位数组即可完成查询。

缺点:

  1. 不可删除:标准布隆过滤器不支持元素的删除操作,因为无法得知哪些位仅是因为当前查询的元素而置1的。

  2. 误报率:随着元素数量增加,误报率也会逐渐升高,但是可以通过调整位数组大小和哈希函数数量来控制误报率。

三、应用场景

  1. 缓存击穿防护(通过缓存数据在数据库是否存在,减少对数据库的访问次数)

  2. 重复数据检测

  3. 垃圾邮件过滤(电子邮件系统的垃圾邮件地址库,快速判断收到的邮件是否可能来自已知的垃圾邮件发送者)

  4. 推荐系统(个性化推荐系统中,用于快速排除用户已经浏览过或者不感兴趣的内容)

  5. 数据分析与挖掘(在大规模数据清洗阶段,用来剔除重复样本或无效数据,采集就是这个场景)

  6. 网络安全(网络防火墙和入侵检测系统中,用于过滤已知恶意IP或攻击特征)

还有很多就不穷举了。

四、采集服务

采集每天可能要处理上百亿的数据,自动导每10分钟要采集近70分钟的聊天记录。这里就存在大量的重复数据,因此需要对数据去重。去重我们采用根据消息id去重,微信聊天记录的消息ID是19位的数字字符串;

  1. 如果直接使用布隆过滤,必然是存在很大的误杀概率。因为布隆过滤最大只有2的32位的长度,大约42亿,10位数字。

  2. 如果直接使用redis缓存消息id来去重,按照每天3亿的有效数据来计算,大约需要8G的内存,显然这也不是个好办法。

最终去重逻辑考虑把每次上传的消息分成3部分,分别是重复数据、偏移数据和新数据三部分,如图:

上面图中,我们每次可以直接过滤掉重复部分的数据,因此我们只需要对偏移部分的数据进行过滤,这大大减少了需要过滤的数据量。再把偏移部分数据使用布隆过滤去重,布隆的误杀率是万分之一。数据量相对较小,且误杀率低。

五、参考资料

布隆过滤器 Bloom Filter-CSDN博客

相关推荐
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄2 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus13 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude20 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司20 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀1 天前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落1 天前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi1 天前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表