原理图:
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 布隆过滤器
* **
*
* @author: Yuezejian Created in 2020/9/29 上午9:02
* @modified By:
*/
public class BloomFilter implements Cloneable, Serializable {
private static final long serialVersionUID = 482498820763181265L;
private static byte[] data;
private static final int INIT_CAPACITY_SIZE = 128;
private float loadFactor = 0.75f;
/**
* Set the capacity 64 when we init the BloomFilter
*/
public BloomFilter() {
this.data = new byte[INIT_CAPACITY_SIZE];
}
/**
* Apply the init capacity method when used the constructor to init the BloomFilter
* @param initCapacity
*/
public BloomFilter(int initCapacity) {
this.data = new byte[initCapacity];
}
/**
* Put the elements to byte[]
* @param key
*/
public void put(int key) {
if (data.length+1 >= data.length * loadFactor) {
data = reHash(data);
}
reSet(key);
}
/**
* validate if contains the element
* @param key
* @return
*/
public static boolean contains(int key) {
int site1 = Math.abs(hash1(key) % data.length);
int site2 = Math.abs(hash2(key) % data.length);
int site3 = Math.abs(hash3(key) % data.length);
return data[site1] * data[site2] * data[site3] == 1;
}
static final int hash1(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ ( h >>> 3);
}
static final int hash2(Integer key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ ( h >>> 16);
}
static final int hash3(Integer key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 32);
}
static final byte[] reHash(byte[] b) {
byte[] cor = new byte[oldCapacity + (oldCapacity >> 1)];
System.arraycopy(data, 0, cor, 0, data.length);
return cor;
}
private static void reSet(int a) {
int site1 = Math.abs(a % data.length);
int site2 = Math.abs(a % data.length);
int site3 = Math.abs(a % data.length);
data[site1] = data[site2] = data[site3] =1;
}
}
位运算推荐:https://www.cnblogs.com/yrjns/p/11246163.html