本文为博主原创文章,转载请注明出处。
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中,但有可能出现误判。相对于hash结构,布隆过滤器具有占用空间更小的优点。
java实现代码:
public class BloomFilter<T> {
private byte[] filter;
private int size;
public BloomFilter(int size) {
this.size = size;
this.filter = new byte[size];
}
public void addElement(T e) {
int hash = Objects.hash(e);
for (int i = size - 1; i >= 0; i--) {
if (1 == (hash >>> i & 1)) {
filter[i] = 1;
}
}
}
public boolean check(T e) {
int hash = Objects.hash(e);
for (int i = size - 1; i >= 0; i--) {
if (1 == (hash >>> i & 1) && filter[i] == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
BloomFilter<String> filter = new BloomFilter(100);
filter.addElement("看了上面的demo,现在是不是对左移和右移了解了很多了呢");
filter.addElement("无符号右移,忽略符号位,空位都以0补齐");
filter.addElement("无符号右移的规则只记住一点:忽略了符号位扩展");
filter.addElement("More reading,and english is important.");
filter.addElement("大哥哥大姐姐,觉得有用打赏点哦!多多少");
System.out.println();
System.out.println(filter.check("大哥哥大姐姐,觉得有用打赏点哦!多多少"));
System.out.println(filter.check("大哥哥1姐姐,觉得有用打赏点哦!多多少"));
System.out.println(filter.check("大哥哥5姐姐,觉得有用打赏点哦!多多少"));
}
}