什么是布隆过滤器
布隆过滤器是一种算法,其核心思想是通过hash运算,判断当前值的hashCode对应的数组下标是否全为1,如果是,则认为存在。否则认为不存在。
需要说明的是,认为存在可能存在误判。但是认为不存在没有误判可能
布隆过滤器原理
布隆过滤器的原理是一套hash函数和一个一维数组(数组长度根据设定的误判率可以计算出来)
当我们插入某个元素时,我们只需要将Hashcode值对应位置上的元素设为1。即插入完成
当我们需要查找某个元素,当前值的hashCode对应的数组下标是否全为1。从插入过程我们可以看出来,如果两个元素通过hashCode方法算出来的值都一样的话,则可能产生误判。
举个例子:
对字符串"小明"进行hashCode函数组计算得到 100,200,300。并放入到数组中。
对字符串"大熊"进行hashCode函数组计算得到 100,200,300。如果查找"大熊"是否存在于布隆过滤器,则会出现误判。
布隆过滤器应用场景
缓存场景 - 缓存穿透到数据库层。首先判断是否存在于布隆过滤器数组中,如果不存在, 直接返回。防止恶意请求打卦我们的数据库。
不过不能完全防止,因为会有一个误判率,但是已经能抵挡大部分无效请求了。
爬虫 - 避免爬取已经爬取过的网站
- 如果爬取过一定不会再爬
- 会漏掉一些网站
布隆过滤器代码实战
public static void main(String[] args) {
int total = 1000000; // 总数量
//默认误报率为0.03
BloomFilter<Integer> bf =
BloomFilter.create(Funnels.integerFunnel(), total, 0.001);
// 初始化 1000000 条数据到过滤器中
for (int i = 0; i < total; i++) {
bf.put( i);
}
// 判断值是否存在过滤器中
int count = 0;
for (int i = 0; i < total + 10000; i++) {
if (bf.mightContain(i)) {
count++;
}
}
//已匹配数量 1000320
System.out.println("已匹配数量 " + count);
}
网友评论