布隆过滤器(Bloom Filter)

转载 2007年10月02日 10:50:00
布隆过滤器
                                               ——转自google黑板报
      在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当集合巨大时,哈希表存储效率低的问题就显现出来了。比如说,一个象 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人(spamer)的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿个 email 地址, 就需要 1.6GB 的内存(用哈希表实现的具体办法是将每一个 email 地址对应成一个八字节的信息指纹 googlechinablog.com/2006/08/blog-post.html,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB, 即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。

      今天,我们介绍一种称作布隆过滤器的数学工具,它只需要哈希表 1/8 到 1/4 的大小就能解决同样的问题。

      布隆过滤器是由巴顿.布隆于一九七零年提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。我们通过上面的例子来说明起工作原理。

       假定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址 X,我们用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8)。再用一个随机数产生器 G 把这八个信息指纹映射到 1 到十六亿中的八个自然数 g1, g2, ...,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个 email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。(见下图)

       现在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单中。我们用相同的八个随机数产生器(F1, F2, ..., F8)对这个地址产生八个信息指纹 s1,s2,...,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是 t1,t2,...,t8。如果 Y 在黑名单中,显然,t1,t2,..,t8 对应的八个二进制一定是一。这样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。

      布隆过滤器决不会漏掉任何一个在黑名单中的可疑地址。但是,它有一条不足之处。也就是它有极小的可能将一个不在黑名单中的电子邮件地址判定为在黑名单中,因为有可能某个好的邮件地址正巧对应个八个都被设置成一的二进制位。好在这种可能性很小。我们把它称为误识概率。在上面的例子中,误识概率在万分之一以下。

      布隆过滤器的好处在于快速,省空间。但是有一定的误识别率。常见的补救办法是在建立一个小的白名单,存储那些可能别误判的邮件地址。
 

url去重 --布隆过滤器 bloom filter原理及python实现

常见URL过滤方法1 直接查询比较即假设要存储url A,在入库前首先查询url库中是否存在 A,如果存在,则url A 不入库,否则存入url库。这种方法准确性高,但是一旦数据量变大,占用的存储空...
  • a1368783069
  • a1368783069
  • 2016年08月07日 15:49
  • 2417

【数据结构】位图BitMap与布隆过滤器BloomFilter

首先先看一下下面这个腾讯的面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 【腾讯】思路一:  最容易想到的解法就是遍历所有的40多亿个整数,...
  • zangyuanan320
  • zangyuanan320
  • 2016年05月30日 15:04
  • 807

大量数据去重:Bitmap和布隆过滤器(Bloom Filter)

5TB的硬盘上放满了数据,请写一个算法将这些数据进行排重。如果这些数据是一些32bit大小的数据该如何解决?如果是64bit的呢? 在面试时遇到的问题,问题的解决方案十分典型,但对于海量数据处理接触少...
  • zdxiq000
  • zdxiq000
  • 2017年02月27日 17:46
  • 1581

HBase总结(九)Bloom Filter概念和原理

Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2014年10月11日 11:50
  • 5687

布隆过滤(Bloom Filter)-必须了解的优化器算法

在最近的一次用户升级中,客户将数据库从11.2.0.1升级到了11.2.0.3版本,虽然只是一个小版本的变化,确引起了严重的性能问题。原本正常的SQL执行计划,因为使用了布隆过滤,导致了百倍的性能衰减...
  • u010719917
  • u010719917
  • 2016年11月05日 19:54
  • 459

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

前言:   最近被网络爬虫中的去重策略所困扰。使用一些其他的“理想”的去重策略,不过在运行过程中总是会不太听话。不过当我发现了BloomFilter这个东西的时候,的确,这里是我目前找到的最靠谱的一...
  • sinat_21903855
  • sinat_21903855
  • 2015年11月12日 00:04
  • 1957

Hbase 布隆过滤器BloomFilter介绍

1、主要功能 提高随机读的性能 2、存储开销 bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,因为StoreFile是不可变的。Bloomfilter是...
  • opensure
  • opensure
  • 2015年06月11日 09:47
  • 9578

Bloom filter 过滤(布隆过滤算法)原理

一,什么是Bloom filter  Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合...
  • luyee2010
  • luyee2010
  • 2013年01月17日 02:00
  • 4520

大数据处理算法—Bloom Filter

1. Bloom-Filter算法简介         Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。        Bloom...
  • u011386690
  • u011386690
  • 2013年07月15日 11:10
  • 1021

BloomFilter布隆过滤器使用

从上一篇可以得知,BloomFilter的关键在于hash算法的设定和bit数组的大小确定,通过权衡得到一个错误概率可以接受的结果。 算法比较复杂,也不是我们研究的范畴,我们直接使用已有的实现。 ...
  • tianyaleixiaowu
  • tianyaleixiaowu
  • 2017年07月07日 17:49
  • 1516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:布隆过滤器(Bloom Filter)
举报原因:
原因补充:

(最多只允许输入30个字)