首页 > 编程知识 正文

bloomfilter原理(cuckoo filter)

时间:2023-05-04 06:05:57 阅读:63975 作者:2357

一.概述bloom滤波器的基础是位图(位数组)的数据结构,它用k个散列函数将此元素映射到位数组的k个点,并将他们设置为1。 检索时,通过调查这k个点是否都为1,可以判断元素是否在BloomFilter中(有一定的误差率)。 如果k个点中有1以外的点,则此元素一定不在bloom过滤器中。 的大致数据结构:

2 .使用场景1 .删除海量数据

2 .处理缓存直通模式的场景检查所请求的key是否存在

三.使用demo guava的bloom过滤器包

package com.vip.learn.guava; import com.Google.com mon.hash.bloom filter; import java.nio.charset.Charset;/* * * createdbyandrew.Huang on 2019/6/3 */publicclassbloomfiltermain { publicstaticvoidmain [ ] args } { bloomfiltersters } into ) ) into.putstring ) from,Charset.defaultCharset,32 * 1024 * 1024L,0.01d; for(intI=0; i 10; I ) bloom filter.put (thread.current thread ().getName ) ) I ); } system.out.println (bloom filter.might contain ('1' ); system.out.println (bloom filter.might contain (thread.current thread ) ).getName ) ('1' ); }输出结果:

四. guava bloomFilter原理1.BloomFilter.create (

)1)首先查看官方api文档对create四种方法的说明

主要三个参数:

*如何将数据插入funnel : bloom过滤器

* expected insertions :期待bloom filter中包含的元素的个数

* fpp (灵活可处理性) :错误允许率

)2)探究底层bloom过滤器如何根据这些参数处理

bloom过滤器在此可以看到您使用的是bloomfilterstrategies.murmur 128 _ mitz _ 64策略类

的numBits和numHashFunctions获取是基于数学理论计算的,如果有兴趣,可以知道https://blog.csdn.net/v _ July _ v/article/details/6685894

2.BloomFilter.put ()方法

可以看到bloom过滤器实际上是在strategy类中实现的,真正的put方法是

点击查看,该类主要通过murmur3_128的混列函数获取混列,并根据混列函数的数量执行k次混列算法对值进行put

3.BloomFilter.mightContains ()方法

在k个混列算法中,如果从一个BitArray.get ) )获得的返回值不是true (即,在该元素的位置不是1 ),则可以看到它返回false

4.guava bloom过滤器的缺点

不能删除元素。 必须估计容量,然后设置bloom过滤器

五、bloom滤波器实现的关键在于位数组容量大小、允许率数值和混列函数的选择,在允许一定概率的错误率的情况下,可以有效处理大量数据的抽取和判定。

from:andrew.huang

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。