布隆过滤器的原理、应用场景和源码分析实现

原理

布隆过滤器数据结构
布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:
在这里插入图片描述
如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1。
例如针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 1、4、7,则上图转变为:
在这里插入图片描述
Ok,我们现在再存一个值 “tencent”,如果哈希函数返回 3、4、8 的话,图继续变为:
在这里插入图片描述
值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。

现在我们如果想查询 “dianping” 这个值是否存在,哈希函数返回了 1、5、8三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 “dianping” 这个值不存在。

而当我们需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。

这是为什么呢?答案跟简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。

作者:YoungChen__
链接:https://zhuanlan.zhihu.com/p/43263751

特点

  • 可以判断某一个数一定不存在
  • 不可以判断某一个数一定存在

应用场景

  • 海量URL的去重

源码实现

  • 三个哈希函数
unsigned int SDBMHash(char *str, unsigned int size)
{unsigned int hash = 0;while (*str){// equivalent to: hash = 65599*hash + (*str++);hash = (*str++) + (hash << 6) + (hash << 16) - hash;}return (hash & 0x7FFFFFFF) % size;
}// RS Hash Function
unsigned int RSHash(char *str, unsigned int size)
{unsigned int b = 378551;unsigned int a = 63689;unsigned int hash = 0;while (*str){hash = hash * a + (*str++);a *= b;}return (hash & 0x7FFFFFFF) % size;
}// JS Hash Function
unsigned int JSHash(char *str, unsigned int size)
{unsigned int hash = 1315423911;while (*str){hash ^= ((hash << 5) + (*str++) + (hash >> 2));}return (hash & 0x7FFFFFFF) % size;
}
  • 插入并给指定位置置1
void BFInsert(BloomFilter *pBF, const char *str)
{unsigned int i1 = pBF->func1(str, pBF->bm.size);unsigned int i2 = pBF->func2(str, pBF->bm.size);unsigned int i3 = pBF->func3(str, pBF->bm.size);BMSetOne(&(pBF->bm), i1);BMSetOne(&(pBF->bm), i2);BMSetOne(&(pBF->bm), i3);
}

优质参考文献

https://www.jianshu.com/p/2104d11ee0a2

https://blog.csdn.net/championhengyi/article/details/72885500

https://baike.baidu.com/item/布隆过滤器/5384697?fr=aladdin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断一个数字是否存在于某一个数据之中

哈希表 这个没啥说的&#xff0c;后面补充 位图 https://blog.csdn.net/csdn_kou/article/details/95337121 布隆过滤器 哈希表位图 https://blog.csdn.net/csdn_kou/article/details/95371085

根据语句自动生成正则表达式

自动生成 http://www.txt2re.com 速查手册 https://www.jb51.net/shouce/jquery/regexp.html

免密登录堡垒机和服务器

免密登录堡垒机 安装oathtool和sshpass 这两个文件安装比较耗费时间&#xff01; brew install oath-toolkit brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb免密登录堡垒机 书写shell脚本 #!/usr/bin/env bash …

mysql建表sql

mysql建表 文章目录mysql建表mysql学生表插入数据建表&#xff0c;学生和idgroup byinner joinmysql学生表 CREATE TABLE courses ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 自增id, student VARCHAR(255) DEFAULT NULL COMMENT 学生, class VARCHAR(255) DEFAU…

Effective C++学习第一天

1&#xff1a;区分C中的术语声明、定义、初始化的概念声明&#xff08;declaration&#xff09;&#xff1a;告诉编译器某个东西的名称和类型&#xff0c;但略去其他细节&#xff08;可以出现多次&#xff0c;编译器不分配内存&#xff09;。定义&#xff08;definition&#x…

Redis运维和开发学习笔记(1) Redis简介

文章目录Redis的特性速度快持久化多种数据结构主从复制高可用和分布式典型的应用场景Redis启动和可执行文件Redis可执行文件说明启动方式验证redisredis常用配置redis数据结构和内部编码Redis是单线程&#xff0c;不会同时执行两条命令哈希慢查询pipelineRedis的特性 速度快 …

Effective C++学习第二天

1&#xff1a;确保对象被使用前已先被初始化&#xff0c;读取未初始化的值会造成不明确的行为&#xff0c;可能导致程序终止运行或者其他不可预期的现象&#xff1b;在C中&#xff0c;当你使用C part of C(C中C语言部分的内容&#xff09;且初始化可能导致运行期成本&#xff0…

Redis运维和开发学习笔记(3)redis搭建集群

Redis运维和开发学习笔记(3)redis搭建集群 文章目录Redis运维和开发学习笔记(3)redis搭建集群Redis集群搭建Redis集群搭建 cp /etc/redis.d/redistest_7001.conf /etc/redis.d/redistest_XXXX.conf :%s/7001/xxxx/g 配置文件内容&#xff1a;cluster-enabled yes ############…

Effective C++学习第三天

1&#xff1a;为多态基类声明virtual析构函数当我们创建一个base class指针指向新生成的derived class时&#xff0c;当删除基类指针时&#xff0c;如果base class是一个non-virtual析构函数时&#xff0c;实际执行的结果通常是derived class中的base成分被销毁&#xff0c;der…

linux创建指定大小的文件

一、生成文件大小和实际占空间大小一样的文件 dd if/dev/zero ofname.file bs1M count1 文件名称name.file bs1M表示每一次读写1M数据&#xff0c;count50表示读写 50次&#xff0c;这样就指定了生成文件的大小为50M。 二、生成文件大小固定&#xff0c;但实际不占空间命令 …

Effective C++学习第四天

条款11&#xff1a;在operator中处理自我赋值的现象虽然我们在平时可能不会出现显示自我赋值的现象&#xff0c;当加入指针或者引用时&#xff0c;可能会出现不同的指针或引用指向同一对象&#xff08;对象的不同别名&#xff09;&#xff0c;这时候我们就得考虑对象是否是同一…

Effective C++学习第五天

条款14&#xff1a;在资源管理类中小心copy行为当我们深入理解“资源取得时机是初始化时机&#xff08;RAII&#xff09;”概念&#xff0c;并以此作为“资源管理类”的核心时&#xff0c;我们可能会遇到将RAII对象复制的情况&#xff0c;一般有两种情况处理这个现象&#xff1…

Redis运维和开发学习笔记(2) redis持久化

Redis运维和开发学习笔记(2) redis持久化 文章目录Redis运维和开发学习笔记(2) redis持久化持久化持久化方式一:RDB触发~~的三种~~方式1. save命令2. bgsave配置触发机制RDB 总结持久化方式二:AOFAOF的三种策略三种策略的优缺点AOF重写机制持久化 redis将所有数据保存在内存中&…

Effective C++学习第六天

条款18&#xff1a;让接口更容易被正确使用&#xff0c;不易被误用设计接口的原则&#xff1a;正确性、高效性、封装性、维护性、延展性以及协议的一致性&#xff1b;设计原则&#xff1a;1&#xff09;导入新类型来预防很多客户端的错误&#xff0c;多使用系统类型&#xff08…

Redis运维和开发学习笔记(4) Redis参数意义

Redis运维和开发学习笔记(4) Redis参数意义 文章目录Redis运维和开发学习笔记(4) Redis参数意义参数意义参数意义 Client连接 问题 id567800790 addr10.18.17.217:37310 fd1572 name age2039114 idle2034860 flagsN db0 sub0 psub0 multi-1 qbuf0 qbuf-free0 obl0 oll0 omem0 …

Effective C++学习第七天

条款23&#xff1a;宁以non-memeber、non-friend替换member函数non-member/non-friend可以给对象带来更大的封装性&#xff0c;从两个方面来考虑&#xff1a;1&#xff09;考虑封装&#xff0c;越多东西被封装&#xff0c;它们就越不可见&#xff0c;就越少人看到它&#xff0c…

Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据读写分离 存在的问题&#xff1a; 手动干预切主等操作主节点的写能力受到单机限制主节点的存储能力受到单机限制 主从模式的故障恢复 当主节点发生故障时&am…

Effective C++学习第八天

条款26&#xff1a;尽可能延后变量定义式的出现时间当你定义了一个变量&#xff0c;如果在使用变量之前出现异常&#xff0c;那么你得承受一次构造成本和析构成本&#xff0c;而且你没有使用该变量&#xff1b;本条款给出的建议是延迟变量的定义&#xff0c;直到非得使用该变量…

Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令

Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令 文章目录Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令info serverinfo clientinfo memoryinfo persistenceinfo statsinfo commandstatsinfo cpuinfo clusterinfo keyspaceinfo server Redis服务器相关的通用…

Effective C++学习第九天

条款32&#xff1a;确定你的public继承塑模出is-a模型class D&#xff08;derived&#xff09;以public形式继承class B&#xff08;base&#xff09;&#xff0c;则每一个类型为D的对象同时也是一个类型为B的对象&#xff0c;反之不成立&#xff0c;因此B比D表现出更加一般化的…