代码如下:

#include <iostream>
#include <vector>
using namespace std;class BitMap
{public:BitMap(size_t range) :_bit(range / 32 + 1) {}void set(const size_t num){int idx = num / 32;//idx 数组下标int bitIdx = num % 32;_bit[idx] |= 1 << bitIdx;}bool find(const size_t num){int idx = num / 32;int bitIdx = num % 32;return (_bit[idx] >> bitIdx) & 1;}void reset(const size_t num){int idx = num / 32;int bitIdx = num % 32;_bit[idx] &= ~(1 << bitIdx);}private:vector<int>_bit;
};//哈希函数的个数: k = m/(n*ln(2)),其中m为位图需要的bit的大小,n为元素个数,k为哈希函数的个数struct HashFun1
{size_t operator()(const string & str){size_t hash = 0;for (const auto & ch : str){hash = hash * 131 + ch;}return hash;}
};struct HashFun2
{size_t operator()(const string & str){size_t hash = 0;for (const auto & ch : str){hash = hash * 65599 + ch;}return hash;}
};struct HashFun3
{size_t operator()(const string & str){size_t hash = 0;for (const auto & ch : str){hash = hash * 1313131 + ch;}return hash;}
};template<typename T, typename HashFun1, typename HashFun2, typename HashFun3>
class BloomFilter
{public:BloomFilter(const size_t num) :_bit(5 * num), _bitCount(5 * num) {}void set(const T & val){HashFun1 h1;HashFun2 h2;HashFun3 h3;int idx1 = h1(val) % _bitCount;int idx2 = h2(val) % _bitCount;int idx3 = h3(val) % _bitCount;_bit.set(idx1);_bit.set(idx2);_bit.set(idx3);}bool find(const T & val){HashFun1 h1;HashFun2 h2;HashFun3 h3;int idx1 = h1(val) % _bitCount;int idx2 = h2(val) % _bitCount;int idx3 = h3(val) % _bitCount;if (!_bit.find(idx1)) return false;if (!_bit.find(idx2)) return false;if (!_bit.find(idx3)) return false;return true;//可能存在}private:BitMap _bit;size_t _bitCount;
};

C++ 实现布隆过滤器(BloomFilter)相关推荐

  1. Flink 结合 布隆过滤器(BloomFilter) 实现去重

    本文开头附:Flink 学习路线系列 ^ _ ^ 1.实时系统去重方案 使用Redis,将实时系统每条数据都去和 Redis 进行判断: 使用 HashSet,因为 HashSet 本身就是无序不重复 ...

  2. 布隆过滤器(BloomFilter)原理 实现和性能测试

    目录 BloomFilter的原理 如何确定最优的m和k? guava中的BloomFilter 使用案例 和HashSet对比 测试环境 测试方式 BloomFilter vs HashSet 在不 ...

  3. 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter

    文章目录 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter 1.布隆过滤器的起源,用途 2.布隆过滤器的概念 3.布隆过滤器的优缺点 1.优点 2.缺点 4.应用 ...

  4. 04 布隆过滤器BloomFilter

    是什么 布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的. 它实际上是一个很长的二进制数组+一系列随机hash算法映射函数,主要用于判断一个元素是否在集合中. 通常我们会遇到很 ...

  5. Redis 高级主题之布隆过滤器(BloomFilter)

    最近计划准备整理几篇关于Reids高级主题的博文,本文整理的是关于布隆过滤器在Redis中如何应用,先来一张思维导图浏览全文. 1. 认识BloomFilter 1.1 原理 布隆过滤器,英文叫Blo ...

  6. 网络爬虫:URL去重策略之布隆过滤器(BloomFilter)的使用

    前言: 最近被网络爬虫中的去重策略所困扰.使用一些其他的"理想"的去重策略,不过在运行过程中总是会不太听话.不过当我发现了BloomFilter这个东西的时候,的确,这里是我目前找 ...

  7. C语言布隆过滤器BloomFilter

    在实现BloomFilter,首先实现一个位图: BitMap 在位图中,每个元素为"0"或"1",表示其对应的元素不存在或者存在. typedef struc ...

  8. Hbase 解析(四) 布隆过滤器(BloomFilter)

    1.简介 1.1 介绍 Bloom filter是1970年引入的一种数据结构,在过去的十年中,由于它为网络主机之间的组成员信息传输提供了带宽效率,因此被网络研究界采用.发送者将信息编码成一个比特向量 ...

  9. 布隆过滤器-BloomFilter

    目录 一.概述 二.详解 三.实现 四.适用业务场景 一.概述 简单讲布隆过滤器就是判断一个列表中是否存在某个元素.一般在JAVA判断是否存在,我们可以Map,Set等容器.但是当数据量特别大的时候, ...

  10. 【redis】详解布隆过滤器BloomFilter的原理,使用场景和注意事项

    文章目录 1. 什么是布隆过滤器 2. 实现原理 2.1 HashMap 的问题 2.2 布隆过滤器数据结构 2.3 BloomFilter 的缺点 2.4 如何选择哈希函数个数和布隆过滤器长度 3. ...

最新文章

  1. python time.time()计算代码运行时间
  2. PUT or POST
  3. 以太坊知识教程------交易
  4. ajax里面可以alert吗,除非我使用alert(),否则Ajax请求不会工作
  5. 逆向与汇编的一些笔记
  6. 2021巨量引擎汽车直播行业研究报告
  7. 僵尸网络 DDoS 攻击活动分析
  8. OC中类别(Catagory)基本使用
  9. MDT 2013 Update 1 Preview 部署 Windows 10之WDS部署服务配置
  10. js逆向 事件点击找加密位置
  11. html5指南针源码,全套指南针软件源码
  12. 单周期CPU设计(Verilog)
  13. Linux常用指令学习(篇一):文件处理指令
  14. golang fmt占位符
  15. 【Unity3d】在Unity3d中使用百度AI人脸识别功能
  16. WinForm引用ActiveX组件,对Com组件的学
  17. 比尔-盖茨出席新世代厕所博览会,展示新一代卫生产品
  18. attiny13a程序实例_关于ATtiny13A的程序
  19. layer tips 宽和高自定义
  20. 如何更改超级用户密码

热门文章

  1. LeetCode之Construct the Rectangle
  2. C++ exception类
  3. Android之面试题精选,自己收藏下
  4. 无代码iVX编程实现简单魂斗罗
  5. php中的匿名函数简单使用
  6. java的概率的程序_java实现一个抽奖概率类
  7. mysql 一对多 关联一条最新的数据_不得不会的mysql锁
  8. jdk源码分析书籍 pdf_什么?Spring5 AOP 默认使用Cglib?从现象到源码深度分析
  9. java 矩阵题目_java练习本(原每日一练)(20190517)
  10. 2020中国十大最丑建筑出炉,你觉得哪个更丑?