布隆过滤器Bloom Filter

参考原文:http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html
在线JS演示
以及 《数学之美》

布隆过滤器 (Bloom Filter)是由Burton Howard Bloom于1970年提出,它是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元素,但不可以删除已有元素。其中的元素越多,false positive rate(误报率)越大,但是false negative (漏报)是不可能的。

理论很明了,但要知道所谓的误报率这个概念,即俗称的 “假阳性”,把不应该识别的个体识别为了黑名单。以及了解误报率如何估算,如何解决。

一、误报率的计算

假设有m个bit作为bit array,每个元素会用k个随机函数进行随机,当已有n个元素时,下一个元素的误报率计算

  • 1.对于bit array的某一个位置来说,当第一个元素来时,第一个随机函数后置位1的概率为1/m
    因此,置为0的概率为 1-1/m
    所以,当k个随机函数结束时,为0的概率为
image.png
  • 2.插入n个元素后
    该位置仍然为0的概率为


    image.png

为1的概率为


image.png
  • 3.此时来了第n+1个元素,这个元素通过k个随机函数分布后,全为1的概率为


    image.png

通过数学变化,化简为


image.png

二、如何设计布隆过滤器

需要考虑的m,n,k3个参数,一般n是固定的,是和你业务实际相关的数据
如果你很懒,可以参考误报率的表格,可以满足大部分需要

计算解析

2.1、我们首先先考虑当n,m确定的时候,K应该如何取值

image.png

懒得打公式,就找了个计算过程,重点是,对每个步骤进行注释

  • 1、为什么最值的时候,直接求右边为0,这是典型的倒推,正确的方式是,因为f(x)是不为0的,先去求f(x)的求导单数有几个点为0,是最后求出来导数为0的点只有1个,才能得出最值的结果,一开始不过得到一个局部的最值罢了
  • 2.xlnx=(1-x)ln(1-x)是怎么一下子得到 x=1-x的?
    因为x属于(0,1)先画图


    f(x)=xlnx-(1-x)ln(1-x).png

    可以看到为0的点只有1个,为x=1/2,这算是用数值法
    xlnx并不是个单调函数,并不能很容易得出相等只有1/2一个点的,当然同过求导,计算2个局部最值,然后分段单调性等证明也是可以的,数值法只是因为比较方便

2.2、知道k后,计算p,m,n的关系

将K带入,很容易得到


image.png

此时可以看到,当false positive的概率P确定时,m和n其实是线性关系,而当n业务确定时,m和p是对数关系

2.3、举例子,简单计算下bloom filter的效率

假设有1亿个人邮箱地址,一条记录8个byte,负载因子为0.75
10^8 * 8/0.75=0.8 GB/0.75=1.06G
而Bloom Filter为当我们接受万分之一的误判率时,
-(10^8)*ln(1/10000) / ((ln2)^2) /8 大概需要 0.23G

如何解决误报

布隆过滤器,本质上是一个概率匹配的模型,他的特性就是肯定不会漏报,但有几率误报,通俗的将"有杀错,没放过"
一般用于邮箱等黑名单时,一般情况下都是黑名单远远小于正常邮箱,但黑名单对也有上亿的量,因此是对黑名单进行布隆。对于误杀的,再通过白名单解决。
结合自身的业务特点,你有上亿的商品,但你为了防止有人用虚假的商品号对你进行攻击,即可以反过来使用布隆过滤器,将有效的放在布隆过滤器,只要正常的都可以过来,但是不正常的攻击,只有很小的概率能过来,一般我们控制在万分之五以下是很容易的。当然,当数量少时,直接用哈希表即可。毕竟布隆过滤器只需要哈希表的1/8或1/4的空间复杂度,仍然是同一量级的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容