package sunfa;
import java.util.BitSet;
import java.util.Random;
/**
* BloomFilter(布隆过滤器)
* http://www.cnblogs.com/allensun/archive/2011/02/16/1956532.html
*
*/
public class BloomFilter {
private int DEFAULT_SIZE = 1 << 6;
private BitSet bitSet = null;// java.util.BitSet的最小长度是1<<6
public BloomFilter() {
init();
}
public BloomFilter(int cmp) {
this.DEFAULT_SIZE = cmp;
init();
}
private void init() {
bitSet = new BitSet(DEFAULT_SIZE);
}
public int size() {
return bitSet.size();
}
private static int oldHash(int h) {
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length - 1);
}
public void add(Object o) {
int i = indexFor(oldHash(o.hashCode()), DEFAULT_SIZE);
bitSet.set(i);
}
public boolean contians(Object o) {
int i = indexFor(oldHash(o.hashCode()), DEFAULT_SIZE);
return bitSet.get(i);
}
public String toString() {
String s = "[";
for (int i = 0; i < bitSet.size(); i++) {
if (bitSet.get(i))
s += i + ",";
}
s += "]";
return s;
}
public static void main(String[] args) {
BloomFilter bloom = new BloomFilter();
System.out.println("bloomFilter.size:" + bloom.size());
Random ran = new Random();
int count = 100;
for (int i = 0; i < count; i++) {
int n = ran.nextInt(100);
System.out.print("before:" + n + "," + bloom.contians(n));
bloom.add(n);
System.out.println("==>after:" + n + "," + bloom.contians(n));
}
System.out.println();
System.out.println(bloom.toString());
}
//幂算法
public static int power(int b, int e) {
if (b == 0 || b == 1 || e == 0) {
return 1;
}
if (1 == e)
return b;
int n = e >> 1;
int tmp = power(b, n);
if (0 == (e & 1))
return tmp * tmp;
else
return tmp * tmp * b;
}
}
BloomFilter(布隆过滤器)
最新推荐文章于 2023-07-26 09:28:25 发布