全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何实现一个Bloom Filter c++布隆过滤器算法【实例】

布隆过滤器用位数组+多哈希实现概率判断:先计算最优位数组大小m和哈希个数k,再通过扰动哈希(如std::hash加种子)生成k个索引,插入设位、查询验位,支持高速去重与缓存防护。

用 C++ 实现一个布隆过滤器,核心是:一个位数组(std::vectorstd::bitset) + 多个独立哈希函数 + 插入/查询逻辑。它不存原始数据,只通过概率方式判断“可能在集合中”或“一定不在”,适合高速去重、缓存穿透防护等场景。

关键设计要点

布隆过滤器不是万能的,实现前需明确三点:

  • 预期元素数量 n:影响位数组大小
  • 可接受的误判率 ε(如 0.01 表示 1%):决定最优哈希函数个数 k 和位数组长度 m
  • 哈希函数必须均匀、独立、快速:推荐用 MurmurHash3 的变体,或基于 std::hash 组合多个种子

位数组与容量计算

位数组大小 m 和哈希函数个数 k 有理论公式:

m = −(n × ln ε) / (ln 2)²k = (m / n) × ln 2

实际中可简化为:

  • n = 100000,目标误判率 ε = 0.01 → 计算得 m ≈ 958506 位(约 117 KB),k = 7
  • C++ 中建议用 std::vector(空间优化)或 std::vector(访问更快);std::bitset 适合编译期确定大小的场景

多哈希函数实现(推荐方案)

避免引入第三方库,可用一个高质量哈希(如 std::hash<:string>)配合不同种子生成多个哈希值:

size_t hash_i(const std::string& s, size_t seed) {
    std::hash h;
    // 将 seed 混入字符串(简单有效)
    return h(s + std::to_string(seed));
}

更健壮的做法是使用 std::hash 对同一字符串多次哈希(通过 reinterpret_cast 搅拌字节),但更常用的是基于一个基础哈希(如 Murmur3)做 k 次扰动。以下是轻量级实现:

  • std::hash<:string> 得到一个 64 位 hash 值
  • 拆成高 32 位和低 32 位,用线性组合生成 k 个独立哈希:(hash1 + i * hash2 + i*i * hash3) % m
  • 这样只需 2~3 次基础哈希,就能模拟 k 个独立分布

完整可运行示例(简洁版)

以下是一个支持字符串插入/查询、自动计算参数的 BloomFilter 类(无外部依赖):

#include 
#include 
#include 
#include 
#include 

class BloomFilter { private: std::vector bits; size_t m, k;

// 快速哈希:用 std::hash 生成两个基础值,再线性组合
size_t hash(const std::string& s, size_t i) const {
    std::hash h;
    size_t h1 = h(s);
    size_t h2 = h(s + "salt"); // 简单扰动
    return (h1 + i * h2 + i * i) % m;
}

public: BloomFilter(size_t n, double error_rate = 0.01) { // 计算最优 m 和 k(向上取整) m = static_cast(-n std::log(error_rate) / (std::log(2) std::log(2))); k = static_cast(m / n * std::log(2)); if (k == 0) k = 1; bits.resize(m, false); }

void insert(const std::string& s) {
    for (size_t i = 0; i < k; ++i) {
        size_t idx = hash(s, i);
        bits[idx] = true;
    }
}

bool may_contain(const std::string& s) const {
    for (size_t i = 0; i < k; ++i) {
        size_t idx = hash(s, i);
        if (!bits[idx]) return false;
    }
    return true; // 所有位置都为 true → 可能存在(可能误判)
}

};

// 使用示例 int main() { BloomFilter bf(1000, 0.01);

bf.insert("apple");
bf.insert("banana");

std::cout << bf.may_contain("apple") << "\n";   // 1
std::cout << bf.may_contain("cherry") << "\n"; // 0 或 1(小概率为 1)

}

注意:该示例用字符串拼接做扰动,仅用于教学;生产环境建议用 MurmurHash3 或 CityHash,并预计算哈希种子提升性能。

进阶优化建议

若需更高性能或工业级使用:

  • std::vector 替代 std::vector,按位操作(|=, &= ~)批量设置,提升吞吐
  • 将 k 个哈希封装为 constexpr 函数(C++20),支持编译期确定
  • 添加 reset()size()estimated_error_rate() 等辅助接口
  • 考虑并发安全:加读写锁,或用 std::atomic(但 vector 不支持原子访问,需换底层存储)


# app  # 字节  # ai  # c++  # ios  # apple  # stream  # String  # if  # 封装  # Filter  # 字符串  # bool  # int  # double  # 接口  # public  # 并发  # 算法  # 多个  # 多哈  # 最优  # 的是  # 是一个  # 进阶  # 就能  # 只需  # 能在  # 更高 


相关文章: 如何在局域网内绑定自建网站域名?  如何快速搭建高效可靠的建站解决方案?  存储型VPS适合搭建中小型网站吗?  建站主机是否属于云主机类型?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何通过IIS搭建网站并配置访问权限?  广德云建站网站建设方案与建站流程优化指南  建站之星如何实现PC+手机+微信网站五合一建站?  制作销售网站教学视频,销售网站有哪些?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何在建站宝盒中设置产品搜索功能?  建站之星安装后如何自定义网站颜色与字体?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何在云虚拟主机上快速搭建个人网站?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何选择服务器才能高效搭建专属网站?  家庭服务器如何搭建个人网站?  如何快速打造个性化非模板自助建站?  C++如何使用std::optional?(处理可选值)  如何在Tomcat中配置并部署网站项目?  韩国服务器如何优化跨境访问实现高效连接?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何选择高性价比服务器搭建个人网站?  建站之星如何实现五合一智能建站与营销推广?  如何快速查询网址的建站时间与历史轨迹?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何通过西部建站助手安装IIS服务器?  如何通过VPS搭建网站快速盈利?  如何获取PHP WAP自助建站系统源码?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  成都响应式网站开发,dw怎么把手机适应页面变成网页?  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  广州建站公司哪家好?十大优质服务商推荐  开心动漫网站制作软件下载,十分开心动画为何停播?  海南网站制作公司有哪些,海口网是哪家的?  如何高效完成自助建站业务培训?  大连网站设计制作招聘信息,大连投诉网站有哪些?  如何快速搭建二级域名独立网站?  如何在Windows虚拟主机上快速搭建网站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  网站图片在线制作软件,怎么在图片上做链接?  ,网站推广常用方法?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  定制建站流程解析:需求评估与SEO优化功能开发指南  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在阿里云高效完成企业建站全流程?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  网站制作公司排行榜,四大门户网站排名? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。