`
543089122
  • 浏览: 149659 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

BloomFilter(布隆过滤器)

阅读更多
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;
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics