布隆过滤器进阶:布谷鸟过滤器 (Cuckoo Filter) 是如何支持“删除”操作的?

标签:#Algorithm #BloomFilter #CuckooFilter #DataStructure #SystemDesign


🚫 前言:布隆过滤器的“死穴”

布隆过滤器的原理是将一个元素通过 个哈希函数映射到位数组的 个点上。

为什么不能删?
假设元素 A 映射到了位置[1, 5, 8],元素 B 映射到了[2, 5, 9]
它们共享了位置5
如果你想删除 A,把1, 5, 8都置为 0,那么 B 在查询时,发现位置5是 0,就会被误判为“不存在”。
这破坏了过滤器的正确性(False Negative 是绝对不允许的)。


🥚 一、 布谷鸟哈希 (Cuckoo Hashing) 的基本思想

布谷鸟过滤器不再存 Bit,而是存储元素的指纹 (Fingerprint)(比如 8-12 bit 的哈希值)。
它有两个哈希桶(Bucket),每个桶有 个位置(Slot)。

“鸠占鹊巢”的插入逻辑:

  1. 计算元素 的两个候选桶索引: 和 。
  2. 如果 有空位,放进去。
  3. 如果 满了,试试 。
  4. 如果 也满了?踢人!
    随便把 或 里现有的一个指纹踢出来,把新指纹放进去。
    被踢出来的那个倒霉蛋,再去寻找它自己的另一个备用位置。如果备用位置也满了,继续踢……
    直到所有鸟都有巢,或者达到最大踢出次数(扩容)。

交互流程图 (Mermaid):

计算位置

计算位置

有空位

已满

有空位

已满 (冲突)

旧元素 Y

插入元素 X

位置 1

位置 2

插入成功

尝试位置 2

插入成功

👿 踢出旧元素 Y

插入 X

计算 Y 的另一个位置

重新插入 Y


🪄 二、 核心魔法:对偶位置计算 (XOR)

在标准的 Cuckoo Hash Map 中,我们需要存储完整的 Key,才能在被踢出时重新计算它的另一个哈希位置。
但在过滤器中,为了省空间,我们只存了指纹(Fingerprint)。由于指纹丢失了信息,我们无法通过指纹还原出原始 Key,那怎么算它的另一个位置呢?

Cuckoo Filter 的作者设计了一个极其巧妙的异或 (XOR)公式:

这个公式的精髓在于“自反性”:

这意味着:

  • 如果你在位置 ,指纹是 ,那么另一个位置 。
  • 如果你在位置 ,指纹是 ,那么另一个位置 。

结论:只要知道当前位置和指纹,就可以算出的另一个位置,根本不需要原始元素 !这就是布谷鸟过滤器支持“踢人”和“移动”的数学基础。


🗑️ 三、 删除操作的实现

有了上面的基础,删除操作变得异常简单且安全。

删除流程:

  1. 用户请求删除元素 。
  2. 计算指纹 。
  3. 计算两个候选位置:
    1. 检查桶 :有没有指纹 ?如果有,从桶里移除它,返回成功。
    2. 检查桶 :有没有指纹 ?如果有,从桶里移除它,返回成功。
    3. 都找不到?说明元素不存在。

    为什么安全?
    因为我们删除的是一个具体的指纹,而不是像布隆过滤器那样粗暴地把一个置零。
    即使两个不同的元素 和 发生了哈希碰撞(映射到了同一个桶),只要它们的指纹不同(概率极高),删除 就绝对不会影响 。

    如果指纹也碰撞了呢?(两个元素哈希位置一样,指纹也一样)。
    这被称为False Deletion。但这只会发生在你有两个完全一样的数据,或者极低概率的指纹碰撞时。对于过滤器来说,这通常是可以接受的(只会导致该存在的元素被误删,变为 False Negative,但这在工程上极少发生)。


    ⚔️ 四、 布隆 vs 布谷鸟:巅峰对决

    特性布隆过滤器 (Bloom Filter)布谷鸟过滤器 (Cuckoo Filter)
    删除支持不支持支持
    空间效率只有在 FPR (误判率) 很高时占优在低 FPR (❤️%) 时更省空间
    查询性能总是 K 次哈希访问2 次内存访问 (通常 1 次命中)
    插入性能稳定快满了会变慢 (因为要踢人)
    实现难度简单稍复杂 (需处理挤兑死循环)
    容量限制必须预估,不可动态扩容必须预估 (虽然支持删除,但桶大小固定)

    🎯 总结

    布谷鸟过滤器通过“指纹存储”+“异或位置推导”,完美解决了布隆过滤器的删除难题。
    它的核心在于那个精妙的异或公式,让我们在不存储原始数据的情况下,依然能在两个哈希桶之间反复横跳。

    Next Step:
    如果你的业务场景是Redis 缓存穿透防护,且数据基本不删除,继续用 Bloom Filter 即可,简单稳定。
    但如果你的场景是垃圾邮件黑名单实时风控系统,黑名单里的 IP 需要频繁添加和移除,那么Cuckoo Filter(或者 Redis 的模块RedisBloom里的 CF 实现)绝对是你的最佳选择。

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

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

    相关文章

    web入门111-120

    web111 分析代码v1必须等于ctfshow,v2使用全局变量 ?v1=ctfshow&v2=GLOBALSweb112 分析代码使用伪协议 ?file=php://filter/resource=flag.phpweb113 分析代码使用zlib:// 伪协议 ?file=compress.zlib://flag.p…

    第 485 场周赛Q1——3813. 元音辅音得分

    题目链接:3813. 元音辅音得分(简单) 算法原理: 解法:模拟 1ms击败100.00% 时间复杂度O(N) 其实题目中要求的向下取整就是默认的 / 就可以,所以我们只需要按要求统计出对应的 v、c 然后按照题目要求返回…

    恶意代码分析:在沙箱中运行勒索病毒,用 IDA Pro 逆向它的加密逻辑

    标签: #MalwareAnalysis #ReverseEngineering #IDAPro #Ransomware #CyberSecurity #Cryptography ⚠️ 高危警告:本文涉及真实恶意样本分析技术。所有操作必须在断网、隔离的虚拟机中进行。严禁在物理机或生产环境中尝试!严禁传播恶意样本&a…

    导师严选2026 AI论文网站TOP8:继续教育写作全攻略

    导师严选2026 AI论文网站TOP8:继续教育写作全攻略 2026年AI论文写作工具测评:为何需要这份榜单? 随着人工智能技术在学术领域的深入应用,越来越多的科研人员和继续教育学习者开始依赖AI写作工具提升论文撰写效率。然而&#xff0c…

    LLM 推理加速:深入 vLLM 源码,揭秘 PagedAttention 如何让吞吐量提升 20 倍?

    标签: #LLM #vLLM #PagedAttention #CUDA #Inference #SystemDesign 📉 前言:显存碎片的“诅咒” 在 vLLM 出现之前,HuggingFace Transformers 的默认推理极其浪费显存。 LLM 推理是自回归的(生成一个 Token,存入 KV Cache,再生成下一个)。传统的 KV Cache 管理方式是…

    完整教程:【Go/Python/Java】基础语法+核心特性对比

    pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

    数据交易中的数据质量评估方法

    数据交易避坑指南:从头搭建你的数据质量评估体系 一、引言:数据交易中,你踩过多少“质量坑”? 去年,我帮一家零售企业做数据交易咨询时,遇到过一个典型的“踩坑案例”: 这家企业花20万买了一份“…

    数据结构3.0 栈、队列和数组

    一、栈的基本概念①栈的定义②栈的基本操作③常考题型④小结二、栈的顺序存储实现①顺序栈的定义②初始化操作③进栈操作④出栈操作⑤读栈顶元素操作⑥共享栈⑦小结三、栈的链式存储实现①链栈的定义②小结#include <stdio.h> #include <stdlib.h>// 链栈的结点结构…

    算子优化实战:手写 Triton Kernel,将 LayerNorm 算子的执行时间压缩 50%

    标签: #Triton #CUDA #AICompiler #HPC #PyTorch #LayerNorm 📉 前言:为什么 PyTorch 原生算子还不够快? PyTorch 的 torch.nn.LayerNorm 虽然底层调用了 cuDNN 或 ATen 的优化实现,但在处理特定 Shape 或与其他算子结合时,依然存在性能损耗: 显存带宽瓶颈:LayerNorm…

    深度测评自考必备一键生成论文工具TOP8

    深度测评自考必备一键生成论文工具TOP8 自考论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着自考人数逐年攀升&#xff0c;论文写作成为众多考生面临的“拦路虎”。从选题构思到内容撰写&#xff0c;再到格式调整&#xff0c;每一个环节都可能成为拖延或出…

    Linux实操篇

    1.1.vim快速入门1.2 vim快捷键1.3用户关机重启1.4登录注销 2.1用户管理12.2用户管理2

    51单片机智能遮阳篷窗户帘衣架蓝牙APP光雨滴检测41(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

    51单片机智能遮阳篷窗户帘衣架蓝牙APP光雨滴检测41(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 产品功能描述&#xff1a; 本系统由STC89C52单片机、雨滴传感器、光照传感器、蓝牙模块、继电器、拨动开关及电源组成 1、可以…

    Java 并发探秘:JCTools 源码剖析,为什么 Netty 放弃 JDK 自带队列而选择 MpscArrayQueue?

    标签&#xff1a; #Java #Netty #JCTools #Concurrency #Performance #FalseSharing&#x1f422; 前言&#xff1a;JDK 队列的痛点 在 Netty 的 Reactor 线程模型中&#xff0c;EventLoop 本质上是一个单线程的执行器。 它需要处理两类任务&#xff1a; IO 事件&#xff1a;来…

    todo

    todo作者很懒,所以经常会立flag,这里是他写下的todo list QAQtodo 创建时间 状态埃氏筛分块筛法 26/1/18 未完成

    Go 调度器 (GMP) 揭秘:从汇编角度看 Goroutine 是如何实现“协程切换”的?

    标签&#xff1a; #Go #Golang #GMP #Assembly #Runtime #Concurrency&#x1f680; 前言&#xff1a;GMP 的本质是“复用” 操作系统线程&#xff08;OS Thread&#xff09;太重了。创建一个线程需要 1-8MB 栈内存&#xff0c;切换一次需要进入内核态&#xff0c;耗时 1-2 微秒…

    【创新未发表】基于matlab鸡群算法CSO和自适应双种群协同鸡群算法ADPCCSO无人机避障三维航迹规划【含Matlab源码 14980期】

    &#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

    第 174 场双周赛Q2——3810. 变成目标数组的最少操作次数

    题目链接&#xff1a;3810. 变成目标数组的最少操作次数&#xff08;中等&#xff09; 算法原理&#xff1a; 解法&#xff1a;模拟 38ms击败11.30% 时间复杂度O(N) ①先计算出哪些是需要修改的 ②统计需要修改的下标 ③原数组中相同的数可以一起修改&#xff0c;所以只要统计不…

    【无人机三维路径规划】基于matlab鸡群算法CSO和自适应双种群协同鸡群算法ADPCCSO复杂山地模型下无人机路径规划【含Matlab源码 14981期】

    &#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

    Day22-20260118

    摘要 本文实现了一个基于Java的交互式计算器程序,具有加减乘除四种运算功能。程序通过定义四个独立的方法(add、subtract、multiply、divide)实现基本运算,采用while循环和switch结构实现用户交互界面。用户可以循环…

    强烈安利9个AI论文写作软件,专科生搞定毕业论文!

    强烈安利9个AI论文写作软件&#xff0c;专科生搞定毕业论文&#xff01; 论文写作的救星&#xff0c;AI 工具如何改变你的学术之路 对于专科生来说&#xff0c;毕业论文可能是大学生活中最令人头疼的一关。从选题、查资料到撰写、修改&#xff0c;每一步都充满了挑战。而如今&a…