Bloom Filter 布隆过滤器

Bloom Filter
1. 介绍
Bloom Filter,被译作称布隆过滤器,是一种数据结构, Bloom Filter包含一个位数组和k个映射函数,一般提供两个方法。 contains 方法用来判断一个元素是否存在于位数组中, addValue方法用来将元素映射入位数组

2.使用场景

2.1黑名单
对用户的 IP或者 Email进行过滤,如果IP或者Email被判断存在于位数组中,则禁止通过
2.2 URL 去重
判断 URL是否已经被抓取
2.3字典纠错
判断单词是否正确

3.原理
设存在一组元素 (x1,x2,x3.....,xm), K个函数, f1,f2,...fk,一个 n位的数组 A。对于元素 xi可以存在如下操作:

位数组A
函数addValue(xi):
-- f1(xi)通过 hash运算将xi映射成一个整数 t1,然后将 A[t1]值设置为1
-- f2(xi)通过 hash运算将xi映射成一个整数 t2,然后将 A[t2]值设置为1
.............
-- fk(xi)通过 hash 运算将xi映射成一个整数 tk,然后将 A[tk]值设置为1

addValue(xi)
函数contains(xi):
-- f1(xi)通过 hash运算将xi映射为一个整数 t1,判断 A[t1]的值是否为1,如果为1,将 r1值设为 true,否则设为 false
............
-- fk(xi)通过 hash运算将xi映射为一个整数 tk,判断 A[tk]的值是否为1,如果为1,将rk的值设为 true,否则设为 false
--使 result=r1&&r2&&....&&rk
--返回result

contains(xi)
注意: Bloom Filter不会存在重复的情况,但是可能存在遗漏的情况,对于元素xi并不存在于位数组中,但是 contains(xi)返回 true,判断结果为已经存在于位数组中。

错误率计算:
设位数组在将所有元素 (x1,x2,x3,....,xn)加入位数组 A后,第 q位不为1的概率位

q'为位数组为1的概率,则 q'的期望为

则错误率为


4.实现
package utils;

import java.util.BitSet;

import service.UrlService;

/**
* bloomfilter
* @author ym
*
*/
public class BloomFilter {
// default storage size
public static int default_size=1<<25;
//hash seed
public static int[] seed={3,23,11,5,9,15,8,20};
//function array to hash url
public BloomHash[] BH;
//storage url hash value
public BitSet bitSet=null;
public BloomFilter(){
bitSet=new BitSet(default_size);
BH =new BloomHash[seed.length];
for(int i=0;i<BH.length;i++){
BH[i]=new BloomHash(default_size,seed[i]);
}
}
/**
* add url to bloom
* @param url
*/
public void addValue(String value){
for(BloomHash fun:BH){
bitSet.set(fun.bloomhash(value),true);
}
}
/**
* judge url is or not exit in bloom
* @param url
* @return
*/
public boolean contains(String value){
boolean ret = true;
for(BloomHash func:BH){
ret=ret&&bitSet.get(func.bloomhash(value));
}
return ret;
}
/**
* fill BloomFilter
*/
public void fill(){
UrlService urlService = new UrlService();
UrlQueue<String> queue = urlService.getVisitedURLQueue();
while(!queue.isEmpty()){
this.addValue(queue.poll());
}
}
/**
* a hash class
* @author
*
*/
public class BloomHash{
int size=0;
int ret=0;
public BloomHash(int size,int ret){
this.size=size;
this.ret=ret;
}
/**
* hash url to int
* @param url
* @return
*/
public int bloomhash(String value){
int result=0;
int len=value.length();
for(int i=0;i<len;i++){
result=result*ret+value.charAt(i);
}
return (size-1)&result;
}
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值