布隆过滤器是名叫bloom的家伙在1970年发明的一个过滤器, 核心思想是告诉你说不存在就一定不存在,说存在不一定存在,现在多用于把数据放入内存,减少网络和磁盘的io
底层是利用长度为n的为二进制位数组,上面有k个哈希算法,每次增加需要多个哈希算法判断多个数组位置,然后修改为1; 查找也是一样,通过多个哈希算法查找数组位置是否为1.如果有一个为0,表示不存在
==这里就涉及到一个问题,哈希算法必然存在哈希冲突。一个值的数组位置为0 ,但是被其他值的哈希算法标识为1 ,所以查找时候说存在就不一定存在。==
换算一下存储100万个元素。就是100万/8/1024≈122千字节 ,还不到1Mb
添加 数据通过多个布隆过滤器函数计算,找到相应的多个二进制数组位,修改为1
查找 同添加一样, 通过多个布隆过滤器函数计算二进制位数组的位置是否为1, 如果都是1,说明有可能存在 如果都不为1,说明一定不存在
删除 因为一个二进制位数据的元素位可能被很多元素共享,所以删除不能实现
/**
*通过google Guava 实现布隆过滤器
*/
public static void main(String[] args) {
/**
* 创建bloom过滤器,
* 固定
* 数量
* 容错率
*/
BloomFilter<String> bloomFilter =
BloomFilter.create(Funnels.unencodedCharsFunnel(), 100, 0.00001);
/**
* 存储100个元素
*/
IntStream.range(0,100).forEach((a) -> {
bloomFilter.put(String.valueOf(a));
});
/**
* 判断容错率
*/
boolean b = bloomFilter.mightContain(1000 + "");
int i = 1;
}