布隆过滤器是名叫bloom的家伙在1970年发明的一个过滤器,
核心思想是告诉你说不存在就一定不存在,说存在不一定存在,现在多用于把数据放入内存,减少网络和磁盘的io

底层是利用长度为n的为二进制位数组,上面有k个哈希算法,每次增加需要多个哈希算法判断多个数组位置,然后修改为1;
查找也是一样,通过多个哈希算法查找数组位置是否为1.如果有一个为0,表示不存在

==这里就涉及到一个问题,哈希算法必然存在哈希冲突。一个值的数组位置为0 ,但是被其他值的哈希算法标识为1 ,所以查找时候说存在就不一定存在。==
image

1
换算一下存储100万个元素。就是100万/8/1024≈122千字节 ,还不到1Mb

添加
数据通过多个布隆过滤器函数计算,找到相应的多个二进制数组位,修改为1

查找
同添加一样, 通过多个布隆过滤器函数计算二进制位数组的位置是否为1,
如果都是1,说明有可能存在
如果都不为1,说明一定不存在

删除
因为一个二进制位数据的元素位可能被很多元素共享,所以删除不能实现


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
*通过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;


}