文章目录1、基本概念2、实例3、影响误判的几个要素4、guava实现的BloomFilter5、总结
1、基本概念
本质上是数据结构,是比较巧妙的概率型数据结构,本身是长的二进制向量,无论是0还是1都存储着。 特点是高校的插入和查询,可以传达“某事物不存在或可能存在”。 主要用于判断某个要素是否存在于某个集合中; 与传统的List、Set、Map等数据结构相比,他具有效率更高、占用空间少,但返回的结果不一定完全正确,具有一定的误判率的缺点。
2、例布隆过滤器为bit向量或bit数组,较长。
要将值映射到光晕过滤器类型,必须使用多个散列函数生成多个散列值,对数组长度建模以获取数组后缀,并将下标更改后的值设置为1。 例如,对于百度,三个散列函数分别生成1、4和7。
存储另一个值“tencent”,用散列函数计算到下标为3、4、8时:
下标为4的这个位置都被两个值占用了。 如果检查另一个值,例如“didi”,则返回1、6和7。 结果,在6这个位置上有0表示该值不存在。 在检查是否存在baidu的值时,三个位置都是1,baidu是否一定存在? 不,百度这个值可能存在。 因为随着增加值的增加,设置为1的位置增加,有一定概率的误定性。 (根据值计算的散列值可能相同,如果散列值不同,则原始值一定不同。)
3、影响误判的几个要素混列函数的个数k、光晕滤波器的长度m、插入的元素的个数n、p是误报率
4、guava实现的bloom过滤器/* * thebitsetofthebloomfilter (notnecessarilypowerof 2! * /专用文件二进制位; //低位bit数组/* * numberofhashesperelement */privatefinalintnumhashfunctions; //hash函数的个数/* * thefunneltotranslatetstobytes */privatefinalfunneltfunnel; //输入过滤器的其他类型的对象以字节/* * * thestrategyweemploytomapanelementto { @ codenumhashfunctions } bit indexes.*/privateed 将元素映射到位数组的策略bits是上述长度为m的位数组,用LockFreeBitArray类型封装。
numHashFunctions即散列函数的个数k。
funnel是funnel接口实现类的实例,用于将任何类型的t输入数据转换为Java基本类型的数据(字节、整型、字符等)。 这里将转换为字节。
strategy是BloomFilterStrategies枚举中的一种模糊过滤器哈希策略,即数据如何映射到位数组。
bloom过滤器提供了创建bloom过滤器实例的create静态方法。
publicstatictbloomfiltertcreate (funneltfunnel,int expectedInsertions /* n */,double fpp ) checknotnull ) ) funnel; check argument (expectedInsertions=0,' expectedInsertions ) %s ) must be=0',expected insertions ); 检查协议(FPP 0.0,' falsepositiveprobability(%s ) must be 0.0 ),fpp ); 检查协议(FPP 1.0,' falsepositiveprobability(%s ) must be 1.0 ),fpp ); if(expectedinsertions==0) { expectedInsertions=1; }/**todo(user ) : putawarninginthejavadocabouttinyfppvalues,* sincetheresultingsizeisproportionalto-log ) p,butthed e.g.optimalm (1000,0.00000000001 )=76680 * which is less than 10k b.who cares */longnumbits=optimalnumofbits (expech intnumhashfunctions=optimalnumofhashfunctions (expected insertions,numBits ); try { returnnewbloomfiltert (newbitarray (numb its )、numHashFunctions、funnel, bloomfilterstrategies.murmur 128 _ mitz } catch (illegalargumentexceptione ) thrownewillegalargumentexception )、' couldnonond funnel是插入数据的funnel,expectedInsertions是希望插入的元素总数n,fpp是假阳性率p,strategy是散列策略。
综上所述,比特数组的长度m和散列函数的个数k分别由optimalNumOfBits (方法和optimalNumOfHashFunctions )方法估计。
计算最佳值:位数组长度和散列函数数:
/**根据要插入的数据量和错误判定率,数组的全长* @ paramn * @ paramp * @ return */staticlongoptimalnumofbits (longn,double p ) if () p==0 } /** *根据要插入的数据量和全长,hash函数的个数* @ paramn * @ paramm * @ return */staticintoptimalnumofhashfunctions (longn,long m ) ) 5、总结1、模糊过滤器具有检索效率高、内存消耗量少的特点
2、缺点有一定的误判率,可以参考guava的实现确定序列长度m和hash函数k
3、本文只介绍了布隆过滤器的原理和guava的实现方式,其中哈希算法的策略,计算m和k的算法需要深入研究
参考资料
3359 www.Jian Shu.com/p/bef 2e C1 c361 f
33559 www.Jian Shu.com/p/2104 d 11e E0 a 2
3359 blog.csdn.net/ZC 1992 12 15/article/details/91047708