Bloom Filter

布隆过滤器
一言以蔽之:布隆过滤器类似于一个没有删除功能的有一定失误率的黑名单系统。利用hash函数的性质,用k个hash函数为每一条数据提取出k个特征,k[i]%m(位图的大小) 得出k个位置,在长度为m的位图上,对k个位置进行描黑。查询时同样对样本进行提取特征,用按位与的方式获取位图上相应的位是否都为1。都为1则证明该条数据在布隆过滤器上存在。在设计布隆过滤器的时候,我们只需要知道样本量N,和预期失误率P,可以通过公式计算出位图大小m,hash函数个数k。


使用布隆过滤器,需要容忍一定程度的失误率。
k个hash函数多少? m长度位图多大? 预期失误率是什么? 样本量大小?
只有允许存在一定程度上的失误,才可以使用布隆过滤器
失误的情况:可能不是黑名单中的内容,却被误报成黑名单中的内容


使用布隆过滤器需要知道样本量
布隆过滤器无法扩容
使用布隆过滤器不需要知道单个样本大小
hash函数能够接收单个样本,计算出一个hash就可以


给定:样本量N, 预期失误率 P

m非常小的时候,失误率会很大
m增大失误率下降,无限趋近于0,但不会是0
k过大会很快的耗尽m

P   /\
    |    \
	|     \
	|      \
p	|------.\
	|      |  ` . _
-----------|---------------------------------- >   m
    |      m
    |
    

布隆过滤器重要的三个公式
1.假设数据量为n,预期的失误率为p (布隆过滤器大小和每个样本的大小无关)
2.根据n和p,算出Bloom Filter 一共需要多少个bit位,向上取整,记为m
3.根据m和n,算出Bloom Filter 需要多少个哈希函数, 向上取整,记为k
4.根据修正公式,算出真实的失误率 p_true (比预期的会低)

m       =  -(n * ln p) / (ln2)^2
k       =  ln2 * (m/n) = 0.7 * m / n
p_true  =  (1 - e^(-(nk)/m)) ^ k

布隆过滤器重要的三个公式


怎么得到k个hash函数,而且他们彼此独立?
只需要找到任意两个hash函数:f( ),g( )
f( ) + 1 * g( ) -> 第1个
f( ) + 2 * g( ) -> 第2个
f( ) + 3 * g( ) -> 第3个

f( ) + k * g( ) -> 第k个


布隆过滤器的存在是为了节省空间

假设100亿数据量,预期失误率万分之一
给定30G空间,可以把100亿样本预期失误率降低到 6 / 100_000

应用
hdfs

删除功能怎么做?
用2个比特位代表一个点
2个比特位可以代表4种状态,即00,01,10,11 可以代表 0,1,2,3 所以描黑一次,比特位进行加1,若删除一次,则比特位减1。但是该设计有很大的局限,而且使用空间会更大。经典布隆过滤器没有删除行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值