惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
G
Google Developers Blog
小众软件
小众软件
V
V2EX
月光博客
月光博客
腾讯CDC
aimingoo的专栏
aimingoo的专栏
J
Java Code Geeks
Y
Y Combinator Blog
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
D
Docker
M
MIT News - Artificial intelligence
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
MongoDB | Blog
MongoDB | Blog
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI

See you soon

哟,好久不见,无线打印 | See you soon 试试将文章版本化管理吧 | See you soon 使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon Linux 内核中的度量单位 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 基于栈的虚拟机与基于寄存器的虚拟机 | See you soon RVA23 包含了什么 | See you soon
支持删除的布隆过滤器 | See you soon
Krysztal Huang · 2025-07-29 · via See you soon

支持删除的布隆过滤器

一般情况下布隆过滤器只能填入不能删除,有些特别的需求比如支持读写删的系统就会需要支持删除的布隆过滤器

原始布隆过滤器

我们先看看原始的布隆过滤器是个怎么回事

前提假设

原始的布隆过滤器有几个很重要的点,其实是个非常简单的东西

  • 一个哈希函数:
    • 注意,该哈希函数最好稳定不需要种子,摘要哈希最好。
  • 一个可以被位操作的数据类型 (也可以叫做向量?毕竟实际上是由一个十分长的位组成的东西)
  • 一个统计有多少位相同的算法:

原始的布隆过滤器使用多个位来作为其内部数据表示,我们这里使用 u8 作为 的实际类型

我们使用上文的 函数来对输入 做如下处理

则我们同样得到了一个类型为u8 的 ,其内容为 0000_0001

判断是否存在

在得到哈希结果后,我们利用这个结果来进行判断

我们使用的数据类型总共有 8 位,其中相等的位数为 7 位,并不完全相等,那么我们可以认为这个元素肯定不存在

写入数据

我们将这个数组写入到这个我们的过滤器里,这样我们的过滤器里的内容就变成了如下内容

  • 假如有新的数据,我们就继续按照判断是否存在来判断是否存在于过滤器中
  • 如果需要写入数据,我们就按照上文来写入数据

假阳性(False Positive)与误判率

假阳性(误判)

考虑到一种情况,我们的布隆过滤器满了

这个时候无论对什么数据进行哈希,得到的结果都会被布隆过滤器判定为存在。那么这里就产生了很重要的问题:误判

误判率

我们做如下假设

  • 布隆过滤器的总位数为
  • 函数 产生的结果为
  • 的位数为

则在插入时布隆过滤器中的某一个特定的位没有被操作的概率是

在完全插入 后某一位仍然为 0 的概率为

在执行了 次插入后,某一位仍然为 0 的概率就为

那么很容易得出,某一位为 1 的概率是

我们假设过滤器中所有位均被设置为 1,那么认为某一个原本不应该在集合中的元素却被误判的概率则为

则我们得到的误判率计算公式为 。对于该公式,我们假设 趋近于无限,则我们可以进行进一步的处理:令 ,我们对 进行极限,根据极限的定义我们可以得到如下的结果

什么?忘了指数函数的极限了?

简单回忆一下一般形式的指数函数的极限:

那么我们可以得到其误判率大概为