C++如何实现一个Bloom Filter?C++空间高效的概率数据结构【算法】


Bloom Filter是一种空间高效的概率型数据结构,用于判断元素“可能在集合中”或“绝对不在”,仅用位数组和多个哈希函数实现,支持add()和contains(),但不支持删除,存在可控误判率。

c++如何实现一个bloom filter?c++空间高效的概率数据结构【算法】

什么是Bloom Filter?为什么用C++实现

Bloom Filter 是一种空间高效的概率型数据结构,用于快速判断一个元素是否“可能在集合中”或“绝对不在集合中”。它不存实际元素,只用少量比特位和多个哈希函数做标记,因此内存占用极小,但存在可控的误判率(false positive),且不支持删除。C++适合实现它,因为能直接控制内存布局、位操作和模板泛型,避免运行时开销。

核心设计:位数组 + 多哈希函数

关键组件只有两个:一个动态位数组(bit array)若干个独立哈希函数。假设位数组长度为 m,插入 n 个元素,用 k 个哈希函数,则最优 k ≈ (m/n) ln2,误判率 ≈ (1 − e−kn/m)k

  • std::vector<uint64_t></uint64_t> 实现位数组,按 64 位整数分块,用位运算(&, |, , )高效读写单个 bit
  • 哈希函数推荐用 std::hash<t></t> 配合不同种子(如乘以质数再异或),或使用 MurmurHash3 的变体,确保分布均匀
  • 对每个元素计算 k 个哈希值,并对 m 取模,得到 k 个位置,全部置为 1

标准接口与关键实现细节

一个实用的 Bloom Filter 类至少应支持 add()contains()size()。注意以下易错点:

  • 位索引计算:哈希值 % m 可能较慢,可用 hash & (m-1) 替代——但要求 m 是 2 的幂,此时需向上取最近的 2 的幂
  • 线程安全:默认不加锁;若需并发写入,可在 add() 中用原子操作(std::atomic_ref<uint64_t></uint64_t>fetch_or)更新对应 word
  • 模板化支持任意类型:通过 std::hash 要求 T 可哈希;对字符串等大对象,可加 move 语义或引用传参减少拷贝
  • 不提供 remove():因为多个元素可能共用同一位,清除会破坏其他元素的存在性

简单可运行示例(无依赖,C++17)

下面是一个轻量级实现的核心骨架(省略异常处理和完整构造逻辑):

MCP市场 MCP市场

中文MCP工具聚合与分发平台

MCP市场 211 查看详情 MCP市场
template &lt;typename T&gt;
class BloomFilter {
    std::vector&lt;uint64_t&gt; bits;
    size_t m; // total bits
    size_t k; // hash functions count
    std::vector&lt;size_t&gt; seeds = {13, 37, 61, 109, 181}; // example seeds
&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;size_t hash(const T&amp; x, size_t seed) const {
    auto h = std::hash&lt;T&gt;{}(x);
    return (h ^ (h &gt;&gt; 32)) * seed;
}

public: BloomFilter(size_t capacity, double false_positive_rate = 0.01) : m{std::max(static_cast(1), static_cast(-capacity log(false_positive_rate) / (log(2)log(2))))}, k{std::max(1UL, static_cast(m / capacity * log(2)))} { m = 1ULL

void add(const T&amp; x) {
    for (size_t i = 0; i &lt; k &amp;&amp; i &lt; seeds.size(); ++i) {
        size_t pos = hash(x, seeds[i]) &amp; (m - 1);
        size_t word_idx = pos / 64;
        size_t bit_idx = pos % 64;
        bits[word_idx] |= (1ULL &lt;&lt; bit_idx);
    }
}

bool contains(const T&amp; x) const {
    for (size_t i = 0; i &lt; k &amp;&amp; i &lt; seeds.size(); ++i) {
        size_t pos = hash(x, seeds[i]) &amp; (m - 1);
        size_t word_idx = pos / 64;
        size_t bit_idx = pos % 64;
        if (!(bits[word_idx] &amp; (1ULL &lt;&lt; bit_idx)))
            return false;
    }
    return true;
}

};

用法:BloomFilter<:string> bf(10000, 0.02); bf.add("hello"); assert(bf.contains("hello")); </:string>

基本上就这些。它不复杂但容易忽略位对齐、哈希分布和误判率估算——调好这三个,就能在缓存穿透防护、URL 去重、数据库布隆索引等场景里稳稳压低内存开销。

以上就是C++如何实现一个Bloom Filter?C++空间高效的概率数据结构【算法】的详细内容,更多请关注其它相关文章!


# ai  # word  # 能在  # 多个  # 如何实现  # 数据结构  # 为什么  # 质数  # 内存占用  # c++  # 营销短视频推广价格低  # 彰化网站推广公司电话是多少  # 做好网站怎么做优化推广  # 温江区网站建设  # 意大利海外推广网站大全  # 宾川县推广营销  # 辽宁数据网站建设哪家好  # 如何提升营销和推广  # 南通如皋seo  # 长沙视频营销推广中心  # 多哈  # 游戏开发  # 如何用  # 如何使用  # 它不  # 是一种 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  PHP实现等比数列:构建数组元素基于前一个值递增的方法  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  鸣潮历史学家灯塔位置一览  c++如何使用std::thread::join和detach_c++线程生命周期管理  rabbitmq 持久化有什么缺点?  CSS如何使用outline-offset与颜色组合突出元素边框  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  全球各国上班时间表外贸邮件时间  C++ static关键字作用_C++静态成员变量与静态函数  阿里旺旺电脑网页版入口 阿里旺旺电脑版网页登录入口  抖音号升级成企业资质怎么弄?有什么好处?  pubmed数据库官方主页_pubmed学术论文查找官网直达  Lar*el 中高效执行多列更新:单次查询实现  奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧  Go Goroutine调度与并发执行深度解析  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  优化Google Charts Gauge:在数据库无数据时显示默认值  汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  使用VS Code调试Python代码:从入门到精通  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  顺丰官方查单号入口 顺丰快递单号查询官网入口  魔法祈幻界兑换码礼包大全  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  mysql中如何分析索引使用情况_mysql索引使用分析方法  Symfony路由参数转换器:实体存在性验证与错误处理策略  人教版电子教材在线获取指南  抖音火山版如何进行提现  《花瓣》创建专辑方法  《顺丰同城骑士》查看我的技能方法  c++类和对象到底是什么_c++面向对象编程基础  Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】  ao3入口镜像地址 ao3镜像入口可靠跳转  Mac如何开启画中画模式_Mac Safari浏览器视频画中画功能  《绿竹漫游》关闭消息通知方法  三星M34录音变声问题_Samsung M34麦克风调整  《万兴喵影》导出视频方法  什么是Satis,如何用它搭建一个私有的composer仓库?  AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例  包子漫画在线观看入口 包子漫画网正版全集链接  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  《全民k歌》音乐怎么下载到本地2025  极兔快递官网查询入口手机版 手机极兔快递登录查询入口官方  作业帮网页版不用下载入口 在线问老师快速答疑  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化 

 2025-12-14

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.