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(布隆过滤器)
猜你喜欢
转载自jqsl2012.iteye.com/blog/1190003
今日推荐
周排行