bloom filter浅析(基本概念,概率分析,源码分析)

Bloom Filter是一种节省空间的概率型数据结构,用于判断一个元素是否可能存在于集合中,允许一定的误判率。本文介绍了其基本概念、假阳性概率分析,并通过源码探讨了其内部机制和哈希函数的设计。Bloom Filter广泛应用于数据库索引、URL过滤和区块链等领域,以减少不必要的磁盘查询,提升性能。
摘要由CSDN通过智能技术生成

基本概念

Bloom filter是一个空间高效(space- efficient)概率算法,被用于测试一个元素是否存在于一个集合中。
存在假阳性(false positive,表示实际是假但误辨为真的情况)匹配的可能,但不存在假阴性(false negatives)的可能。也就是说,一次查询返回的结果是可能在集合里或者绝对不在集合里
最常用的操作是校验元素是否存在于集合中,也可以添加元素,但不可以删除元素。
同时,越多元素被加入到集合中,假阳性的概率就会越高。
Bloom filter一般应用在内存有限的索引场景,在可容忍的低误判的情况下,以极低的存储代价,实现去除绝大部分不必要的查询的便利。
在这里插入图片描述在这里插入图片描述

定义

一个空的bloom filter是一个有 m 位的位数组,同时也定义 k 个哈希函数,每一个哈希函数映射元素到位数组的其中一个位。

添加:设置每一个哈希函数映射到的位为1。
查询:查询每一个哈希函数映射到的位是否都为1。只要有任意一个位不为1,则表明该元素绝对不存在。如果都为1,但也只能表明该元素可能存在(对于一般的bloom filter实现)。
删除:不支持。

补充:
要枚举所有在bloom filter中的元素是很困难的(譬如,需要许多的硬盘读取)

假阳性比例过高时,可以重新生成一个过滤器(以使得过滤器的假阳性低于某一个标准),只是这是一种相对非常少见的情况。

应用

  • Google Bigtable、Apache Hbase、Apache Cassandra、PostgreSQL使用bloom filter来减少在磁盘上对不存在的行或列的查找。避免代价高昂的磁盘查询可以有效地提高数据库的查询性能。
  • Google Chrome使用bloom filter来识别有害url。
  • Microsoft Bing使用多层级的bloom filter来作为搜索的索引(BitFunnel,github上有对应的repo)。
  • Bitcoin曾使用bloom filter来加速同步数字钱包。
  • Medium使用bloom filter以避免对同一用户重复推荐相同的文章。
  • Ethereum使用bloom filter在区块链上快速搜索logs。

概率分析

假阳性的概率(probability of false positive)

一个重要的前提条件,哈希函数映射到数组的每一个不同位置的概率是相等的,即简单均匀散列(simple uniform hashing)。

假设 m 为数组的位数,在对布隆过滤器插入一个元素时,某一位未被某一哈希函数(映射到)设置为1的概率是 1 − 1 m 1 - \frac{1}{m} 1m1
因为数组长度为m,任意某一位被任意某一哈希函数设置为1的概率是 1 m \frac{1}{m} m1 ,那么未被设置为1即可得。

假设 k 为哈希函数的数量,每一个都是互相独立的(任意一个哈希的结果不依赖于任意其他的哈希结果),那么数组中的某一位未被散列函数设置为1的概率是 ( 1 − 1 m ) k (1 - \frac{1}{m})^k (1m1)k

根据微积分的知识,我们知道一个特殊的极限(也是自然对数 e 的定义)
l i m x → − ∞ ( 1 − 1 m ) k = 1 e lim_{x \to -\infty}{(1 - \frac{1}{m})^k} = \frac{1}{e} limx(1m1)k=e1
又因为
( 1 − 1 m )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值