布隆过滤器在好多地方用的到,例如大量数据去重操作,redis中的防止击穿等。布隆过滤器的优点是占用空间少,缺点是有可能会有重复数据,所以在绝对严谨的重复判断操作情况下 简单的布隆过滤器是无法使用的,而且无法进行删除操作,因为里面保存的是hashcode码 并不是具体数据,下面将通过java实现简单的布隆过滤器
package com.jvm;
import java.util.BitSet;
public class BlooFilter {
private static final int CAPACITY = 2 << 28;
private BitSet bitSet = new BitSet(CAPACITY);
private int[] coefficient = {11, 13, 17, 19, 23, 31};
public static void main(String[] args) {
BlooFilter blooFilter = new BlooFilter();
String[] array = {"小刚", "丽丽", "菲菲", "命名", "小强"};
for (String arg : array) {
blooFilter.add(arg);
}
System.out.println(blooFilter.contains("丽丽"));
}
/**
* 判断是否包含当前元素
*
* @param arg 参数
* @return boolean
*/
private boolean contains(String arg) {
if (arg == null) {
return false;
}
for (int cof : coefficient) {
return bitSet.get(hash2(cof, arg));
}
return true;
}
/**
* 向blooFilter中添加元素
*
* @param s 年代
*/
private void add(String s) {
for (int col : coefficient) {
bitSet.set(hash2(col, s));
}
}
/**
* 容量与hashcode 并操作主要是为了不要超过容器大小,>>>无符号右移十六位 参加亦或运算。
*
* @param col 上校
* @param key 关键
* @return int
*/
private int hash2(int col, String key) {
int h;
return key == null ? 0 : (col * (CAPACITY - 1) & ((h = key.hashCode()) ^ (h >>> 16)));
}
}
但是在项目中使用的时候,并不需要自己手动写直接调用
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class TTTT {
public static void main(String[] args) {
BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), 2 >> 28);
for (int i = 0; i < 10000000; i++) {
bf.put(i);
}
System.out.println(bf.mightContain(50));
}
}
完事。。。。