Bloom Filter的使用--亿级元素查找缺失的元素

看了几篇大神的文章后,特异记录下心得

Bloom Filter 有如下几个特点:

1.只要返回数据不存在,则肯定不存在
2.返回数据存在,但只能是大概率存在
3.同时不能清除其中的数据
它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难;所以用来排查大量数据中缺少哪些数据是比较好的选择。

实现原理

下图详解:
如何去判断值是否存在数组中

bloomFilter 初始

bloomFilter

1.初始化一个长度为L的二进制的数组,值全部设为0;
2.当写入一个A1=1000的数据时,需要进行H次的hash函数运算(这里定义为两次),通过算出hashcode与L取模定位到0和2,并将值设为1。
3.A2=2000也是同理计算后定位到4和7,值设为1。
4.当一个值B1=1000需要判断是否存在时,也是需要做两次的hash运算,定位到0和2,此时他们的值都为1,那么B1=1000存在集合中。
5.当B2=3000时,也是同理,进行两次hash运算,第一次定位到4,值为1;所以进行第二次hash运算,第二次定位到5,值为0;所以B2=3000不存在集合中。

具体应用

4.网络应用

  1)P2P网络中查找资源操作,可以对每条网络通路保存Bloom Filter,当命中时,则选择该通路访问。

  2)广播消息时,可以检测某个IP是否已发包。

  3)检测广播消息包的环路,将Bloom Filter保存在包里,每个节点将自己添加入Bloom Filter。

 4)信息队列管理,使用Counter Bloom Filter管理信息流量。

5. 垃圾邮件地址过滤

    像网易,QQ这样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。

一个办法就是记录下那些发垃圾邮件的 email地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。

如果用哈希表,每存储一亿个 email地址,就需要 1.6GB的内存(用哈希表实现的具体办法是将每一个 email地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个email地址需要占用十六个字节。一亿个地址大约要 1.6GB,即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB的内存。

而Bloom Filter只需要哈希表 1/8到 1/4 的大小就能解决同样的问题。

BloomFilter决不会漏掉任何一个在黑名单中的可疑地址。而至于误判问题,常见的补救办法是在建立一个小的白名单,存储那些可能别误判的邮件地址。

简单代码实现

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 散列表,它是基于高速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构能够理解为一个线性表...
    江江JJ阅读 1,924评论 0 6
  • What is Hashcash? Hashcash is a proof-of-work system used...
    R0b1n_L33阅读 700评论 0 0
  • 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表...
    yeying12321阅读 3,707评论 0 6
  • 〇、序言 货币由于其天然属性决定了其与安全不可分割的联系,从最早的金库、保险柜、镖局到后来的ATM机、运钞车;从存...
    怒马2048阅读 39,124评论 4 79
  • NBN的故事58:如此大的宇宙 时间:9000年2月28日 地点:宇宙 别说其他NBN了,就连遨游多方的甲比安...
    我我了阅读 173评论 1 2