更多内容请访问我的个人博客www.tenliu.top
简介
Bloom Filter(布隆过滤器)是一种多哈希函数映射的快速查找算法。通常应用在需要快速判断一个元素是否属于集合,但是并不是严格要求100%正确的场合。
即Bloom Filter是会误判的,但是它只会把不存在于集合中的元素误判成存在于集合中,而不会把存在于集合中的元素误判成不存在集合中。
场景
我最初使用Bloom Filter的场景是爬虫的链接去重。如果我们采用最笨的方法,保存所有抓取过的url,那么当数据越来越大,去重判断的速度当然会降低,内存消耗也会越来越大,即使加入摘要算法、采用hash存储,也仅仅是减缓这个趋势而已。
我需要寻找一种,即使在url很多的时候,依然速度快,内存消耗小的方法。由此采用Bloom Filter,并且Bloom Filter的错判的代价,对我这个应用场景而言,仅仅是少抓取几个页面而已,完全可以接受。
原理
Bloom Filter仅仅维护一个m位的BitArray(位数组),最开始m位全部为零。不断记录元素(如已经抓取的url),也仅仅是m位的BitSet中有些位置由0置成1的过程。
此外,Bloom Filter需要K个不同的hash函数,并且每个hash函数的结果要是在0~m-1范围的,因为我们要把每一个hash函数的结果i映射到位数租的第i位上去。
记录元素
下面我们看一下向Bloom Filter插入字符串的具体过,就是把这个字符串str经过K个不同的hash函数计算得到的结果h1、h2、、、hK。然后在BitArrray的第h1、h2、、、hK的位置上置1。
如图所示
判断元素
那么如何判断一个字符串str是存在呢,这个过程你应该是可以自己想到的。
把这个字符