用来判断一个元素是否在一个集合中
主要的使用场景是用来解决缓存穿透
判断一个元素是否在一个集合中。当数据量比较少时,我们使用list,map等集合即可,但是当数据量是海量时,集合就不能满足我们的需求了,此时就可以使用布隆过滤器
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数组成
假设布隆过滤器的二进制数组长度为10,哈希函数为3个
二进制数组中的值一开始都是0
当我们向布隆过滤器插入元素"hello"时,步骤如下:
插入元素
当我们判断元素"hello"是否存在时,步骤如下:
二进制向量
如上图,插入元素"hello"后,二进制数组中下标为2,4,7的二进制值为1,但是我们想在布隆过滤器中删除元素时,并不能直接把对应下标的二进制值改为0。
因为在插入其他元素时,经过哈希函数计算得到的下标也可能是这其中的一个或者全部,所以如果直接把二进制值改成0,可能会影响其他元素!!!
假设"你好"经过哈希函数计算后得到的结果和"hello"相同,则判断元素是否存在时,"你好"也会被判断也存在,实际上不存在于布隆过滤器
pom.xml
com.google.guava
guava
23.0
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class BloomFilterDemo {
public static void main(String[] args) {
// 创建布隆过滤器,指定元素个数和误判率
BloomFilter bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 500, 0.01);
// 插入元素
bloomFilter.put(1);
bloomFilter.put(2);
bloomFilter.put(3);
// 判断元素是否存在
System.out.println(bloomFilter.mightContain(1));
System.out.println(bloomFilter.mightContain(2));
System.out.println(bloomFilter.mightContain(3));
System.out.println(bloomFilter.mightContain(4));
}
} | 留言与评论(共有 0 条评论) “” |