通过K个散列函数把数据分布在位数组bitmap上,并置位1,当查询的时候同样的算法看是否分布在位1的数组上。只要有个不为1,则不存在。不会误杀,但是可能会有漏网之鱼通过布隆过滤器(可以通过设置fpp来控制)。
maven
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
package com.xdf.xcloud.api.utils;
import java.time.Duration;
import java.time.LocalDateTime;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class TestBloomFilter {
private static int total = 1000000;
// private static BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), total);
private static BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), total, 0.01);
public static void main(String[] args) {
// 初始化1000000条数据到过滤器中
LocalDateTime now = LocalDateTime.now();
for (int i = 0; i < total; i++) {
bf.put(i);
}
// 匹配已在过滤器中的值,是否有匹配不上的
for (int i = 0; i < total; i++) {
if (!bf.mightContain(i)) {
System.out.println("误杀");
}
}
// 匹配不在过滤器中的10000个值,有多少匹配出来
int count = 0;
for (int i = total; i < total + 10000; i++) {
if (bf.mightContain(i)) {
count++;
}
}
System.out.println("漏网的数量:" + count);
LocalDateTime now2 = LocalDateTime.now();
Duration between = Duration.between(now, now2);
System.out.println(between.toMillis());
}
}
成功率可以达到100,只要fpp设置的够低。但是时间和bitmap空间消耗就越大。