java简单实现布隆过滤器
java代码实现
为了方便理解布隆过滤器,java简单实现了下,
特点:仅用做一次运算就可以判断存在不存在,但是只能精确的判断值不存在,不能精确的判断值存在
,实际使用中可以用redis或者guava的实现
public class BlTest {
private final int f = 1024; // 负载因子,值越大判断的越精准,但是所占的空间也越大
int[] bArray;
BlTest(){
this.bArray=new int[f];
}
void addKey(String s){
int i = s.hashCode() % f;// 不同字符串取模后的值可能相同,所以会存在哈希碰撞。
if(bArray[i]!=1){
bArray[i]=1;
}
}
boolean exists(String s){
return bArray[s.hashCode() % f]==1;
}
public static void main(String[] args) {
BlTest blTest = new BlTest();
blTest.addKey("10068");
blTest.addKey("123456");
System.out.println(blTest.exists("10086"));
System.out.println(blTest.exists("123456"));
System.out.println(blTest.exists("10010"));
}
}
redis实现
@Autowired
private Redisson redisson;
@GetMapping("/test")
public AjaxJson test() {
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("phoneList");
//初始化布隆过滤器:预计元素为100000000L,误差率为3%
bloomFilter.tryInit(100000000L,0.03);
//将号码10086插入到布隆过滤器中
bloomFilter.add("10086");
//判断下面号码是否在布隆过滤器中
System.out.println(bloomFilter.contains("123456"));//false
System.out.println(bloomFilter.contains("10086"));//true
return AjaxJson.success();
}
guava 实现
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),100000,0.01);
bloomFilter.put("10086");
System.out.println(bloomFilter.mightContain("123456"));
System.out.println(bloomFilter.mightContain("10086"));