C++ 实现布隆过滤器(BloomFilter)
代码如下:
#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)相关推荐
- Flink 结合 布隆过滤器(BloomFilter) 实现去重
本文开头附:Flink 学习路线系列 ^ _ ^ 1.实时系统去重方案 使用Redis,将实时系统每条数据都去和 Redis 进行判断: 使用 HashSet,因为 HashSet 本身就是无序不重复 ...
- 布隆过滤器(BloomFilter)原理 实现和性能测试
目录 BloomFilter的原理 如何确定最优的m和k? guava中的BloomFilter 使用案例 和HashSet对比 测试环境 测试方式 BloomFilter vs HashSet 在不 ...
- 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter
文章目录 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter 1.布隆过滤器的起源,用途 2.布隆过滤器的概念 3.布隆过滤器的优缺点 1.优点 2.缺点 4.应用 ...
- 04 布隆过滤器BloomFilter
是什么 布隆过滤器(英语:Bloom Filter)是 1970 年由布隆提出的. 它实际上是一个很长的二进制数组+一系列随机hash算法映射函数,主要用于判断一个元素是否在集合中. 通常我们会遇到很 ...
- Redis 高级主题之布隆过滤器(BloomFilter)
最近计划准备整理几篇关于Reids高级主题的博文,本文整理的是关于布隆过滤器在Redis中如何应用,先来一张思维导图浏览全文. 1. 认识BloomFilter 1.1 原理 布隆过滤器,英文叫Blo ...
- 网络爬虫:URL去重策略之布隆过滤器(BloomFilter)的使用
前言: 最近被网络爬虫中的去重策略所困扰.使用一些其他的"理想"的去重策略,不过在运行过程中总是会不太听话.不过当我发现了BloomFilter这个东西的时候,的确,这里是我目前找 ...
- C语言布隆过滤器BloomFilter
在实现BloomFilter,首先实现一个位图: BitMap 在位图中,每个元素为"0"或"1",表示其对应的元素不存在或者存在. typedef struc ...
- Hbase 解析(四) 布隆过滤器(BloomFilter)
1.简介 1.1 介绍 Bloom filter是1970年引入的一种数据结构,在过去的十年中,由于它为网络主机之间的组成员信息传输提供了带宽效率,因此被网络研究界采用.发送者将信息编码成一个比特向量 ...
- 布隆过滤器-BloomFilter
目录 一.概述 二.详解 三.实现 四.适用业务场景 一.概述 简单讲布隆过滤器就是判断一个列表中是否存在某个元素.一般在JAVA判断是否存在,我们可以Map,Set等容器.但是当数据量特别大的时候, ...
- 【redis】详解布隆过滤器BloomFilter的原理,使用场景和注意事项
文章目录 1. 什么是布隆过滤器 2. 实现原理 2.1 HashMap 的问题 2.2 布隆过滤器数据结构 2.3 BloomFilter 的缺点 2.4 如何选择哈希函数个数和布隆过滤器长度 3. ...
最新文章
- python time.time()计算代码运行时间
- PUT or POST
- 以太坊知识教程------交易
- ajax里面可以alert吗,除非我使用alert(),否则Ajax请求不会工作
- 逆向与汇编的一些笔记
- 2021巨量引擎汽车直播行业研究报告
- 僵尸网络 DDoS 攻击活动分析
- OC中类别(Catagory)基本使用
- MDT 2013 Update 1 Preview 部署 Windows 10之WDS部署服务配置
- js逆向 事件点击找加密位置
- html5指南针源码,全套指南针软件源码
- 单周期CPU设计(Verilog)
- Linux常用指令学习(篇一):文件处理指令
- golang fmt占位符
- 【Unity3d】在Unity3d中使用百度AI人脸识别功能
- WinForm引用ActiveX组件,对Com组件的学
- 比尔-盖茨出席新世代厕所博览会,展示新一代卫生产品
- attiny13a程序实例_关于ATtiny13A的程序
- layer tips 宽和高自定义
- 如何更改超级用户密码
热门文章
- LeetCode之Construct the Rectangle
- C++ exception类
- Android之面试题精选,自己收藏下
- 无代码iVX编程实现简单魂斗罗
- php中的匿名函数简单使用
- java的概率的程序_java实现一个抽奖概率类
- mysql 一对多 关联一条最新的数据_不得不会的mysql锁
- jdk源码分析书籍 pdf_什么?Spring5 AOP 默认使用Cglib?从现象到源码深度分析
- java 矩阵题目_java练习本(原每日一练)(20190517)
- 2020中国十大最丑建筑出炉,你觉得哪个更丑?