布隆过滤器

布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “一定不存在或者可能存在”。

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

布隆过滤器的工作原理

假设一个长度为m的bit类型的数组,即数组中每个位置只占一个bit,每个bit只有两种状态:0,1,所有bit的初始状态都为0。

再假设一共有k个哈希函数,这些函数的输出域大于或者等于m,并且这些哈希函数,彼此之间相互独立,每个哈希函数计算出来的结果是独立的,可能相同也可能不相同,对每一个计算出来的结果都对m取余(%m),然后再将数组下标位置置为1。

我们这里假设m为13,k为3的布隆过滤器,来看看布隆过滤器的工作原理:

当我们要映射一个值到布隆过滤器时,首先计算三个哈希函数的值,然后对13取余,映射到对应位中,图中映射到2,6,10,这样我们就完成了一个值的映射。

那么怎么判断一个值是否存在,当一个值输入时,通过三个哈希函数,然后取余,我们就可以得到对应的三个位置,我们只需要判断这三个位置是否都为1,如果都为1,则该值存储,反之不存在。

但是有一个特殊情况,前面说了不同的哈希函数可能计算可能相同也可能不相同,而且不同的哈希函数对不同的值计算出来的值可能一样,这就造成一个结果,一个值通过哈希和取余得到的位置,早就被其它值给置1了,当我们存储的值过多,而这个bit数组过小,都会造成这种情况更多的发生,一个值明明不存在,而它的所有位置早就被其它不同值置1,造成了误判,这里就对布隆过滤器提出了一个指标:失误率p。

在同样数据规模下,不同大小的bit数组及不同数量k的哈希函数对误判率的结果:

如何选取最合适的m(bit数组的大小)及k(哈希函数的数量),在已知n(需要映射的值得数量)及失误率p的情况下:

m的选取:

k的选取:

给个例子:假设n=100亿,p=0.01%

通过公式计算出来m=19.19n,向上取整位20n,即2000亿个bit,也就是25gb。

通过公式计算出来k=14。

计算真实失误率:

根据公式计算出来的真实失误率位0.006%。

c语言实现

#include

#define Size 100

#define BitSIZE Size * 4 * 8

//c语言中一个整型数据类型4个字节

int bit[Size]={0};

int SDBMHash(char *str)

{

unsigned int hash = 0;

while (*str)

{

// equivalent to: hash = 65599*hash + (*str++);

hash = (*str++) + (hash << 6) + (hash << 16) - hash;

}

return (hash & 0x7FFFFFFF);

}

int RSHash(char *str)

{

unsigned int b = 378551;

unsigned int a = 63689;

unsigned int hash = 0;

while (*str)

{

hash = hash * a + (*str++);

a *= b;

}

return (hash & 0x7FFFFFFF);

}

int JSHash(char *str)

{

unsigned int hash = 1315423911;

while (*str)

{

hash ^= ((hash << 5) + (*str++) + (hash >> 2));

}

return (hash & 0x7FFFFFFF);

}

void Insert(int hash){

//int value = hash%BitSIZE; ([0-3200]范围的值)

//int listindex = value / 32; (listindex为数组下标)

//int bitindex = value % 32; (某位)

int value = hash%BitSIZE;

int listindex = value / 32;

int bitindex = value % 32;

int temp = bit[listindex];

bit[listindex] = bit[listindex] & (1 << bitindex);

bit[listindex] = bit[listindex] | temp;

}

int Serach(int hash){

int value = hash%BitSIZE;

int listindex = value / 32;

int bitindex = value % 32;

if (bit[listindex] | (1 << bitindex)){

return 1;

}

return 0;

}

int main () {

char str1[] = "abc123";

//在布隆过滤器中插入某值

Insert(SDBMHash(str1));

Insert(RSHash(str1));

Insert(JSHash(str1));

//在布隆过滤器中判断某值是否存在

int i = 0;

i = i+Serach(SDBMHash(str1));

i = i+Serach(RSHash(str1));

i = i+Serach(JSHash(str1));

if(i == 3){

printf("字符串:%s存在\n",str1);

}

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

布隆过滤算法c语言,通过实例解析布隆过滤器工作原理及实例相关推荐

  1. mysql布隆过滤器源码_通过实例解析布隆过滤器工作原理及实例

    布隆过滤器 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 "一定不存在或者可能存在& ...

  2. 高手实例解析蠕虫病毒的原理

    一直对蠕虫病毒都是不了解,今天做了20年奇安信的试题真好有道相关的题就去了解一下,发现一位大神十几年前写的一篇文章让我豁然开朗了不少. 高手实例解析蠕虫病毒的原理 - TechTarget安全 同时发 ...

  3. Webservice工作原理及实例

    Web Service工作原理及实例 一.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intran ...

  4. 自举升压电路解析(电荷泵工作原理)

    图中自举升压电路解析(电荷泵工作原理): 1.上电时:电源+11V流过D1.D2向C3充电,C3上的电压很快升至接近11V: 2.如果Q6导通,C1负极被拉低,C1形成充电回路,会很快C1充电至11V ...

  5. python函数实例解析_python支持返回函数的实例解析

    这篇文章主要介绍了python支持返回函数的实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近接触python,看到了python中返回函数的概念,以前只接触过 ...

  6. (转)spring源码解析,spring工作原理

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/ Spring 的骨骼架构 Spring 总共有十几个组件,但是 ...

  7. linux traceroute命令详解_详解Linux系统路由跟踪指令traceroute语法、工作原理和实例说明...

    概述 traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不 ...

  8. 高速光耦(PS8101,TLP112A,TLP109)基本工作原理应用实例

    PS8101,TLP112A 是采用5pin SOP封装的高速光耦合器,速率达到 1 Mbps. PS8101由Renesas生产,TLP112A和TLP109由Toshiba生产.      采用S ...

  9. Exchanger的工作原理及实例

    1.实现原理 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchan ...

最新文章

  1. 菜单Menu(AS开发实战第四章学习笔记)
  2. FM-2018-大熊猫的肠道菌群可能并没有特化出发酵纤维素的能力
  3. NCBI 下载fna文件 human viral bacteria
  4. vim 同一行内单字符搜索跳转(笔记)
  5. corosync+pacemaker+nfs提供mysql高可用
  6. KafkaAPI实战
  7. matlab 元胞调用方法你真的理解了么?
  8. js 数组的属性及其常用的方法
  9. 1041. 考试座位号(15)-PAT乙级真题
  10. python编写请求参数带文件_python:解析httppost请求,其中包含文件上传和其他参数...
  11. windows 安装 telnet 工具
  12. oracle临时表的创建
  13. geek软件是干什么的_geektool--一款很geek的工具
  14. 机器视觉培训-苏州机器视觉公司,课程安排历时7天
  15. app客户端上传图片实现方式
  16. 使用PicGo和阿里云OSS建立云图床
  17. 前端练习:day02
  18. 微信8年,这几个冷知识你都知道吗?想必知道的人也不多吧
  19. 碎片化NFT研究报告:COSONFT提高NFT流动性的探索和实践
  20. 数学词汇的英译,写文章,读文献必备

热门文章

  1. “请给我一个女朋友”“我给你一个大嘴巴子”,微信官方真给人实现愿望了...
  2. 中国人去日本买电饭煲令人痛心!董明珠:难道我泱泱大国造不出吗?
  3. 苹果为了提升销量真是拼:用你的iPhone做最后一件好事
  4. 华为P30Pro开箱照曝光 四摄模组+徕卡镜头确认
  5. 星巴克“猫爪杯”遭国人疯抢 而 “大白兔冰淇淋”在美国大火
  6. 晨哥真有料丨一定要在一个月内让她爱上你!
  7. linux pxe安装视频,Linux—图解PXE实现全自动安装系统(1)
  8. TKDragView_TKCalendarView:页面curl的动画日历
  9. mjpeg解码到rgb
  10. python列索引行的数据公式_用列和行索引函数填充dataframe缺失元素的最有效方法...