布隆过滤器及Java实现

布隆过滤器实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器用于检索一个元素是否在一个集合中


优点
布隆过滤器具有空间和时间优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash 函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势

缺点

存在一定误算率,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但如果某个元素确实没有在该集合中,那么Bloom Filter是不会报告该元素存在于集合中的,不会漏报;另外从布隆过滤器中删除元素困难.


具体实现
先建立一个16亿二进制常量,然后将这16亿个二进制位全部置0。对于每个字符串,用8个不同的随机产生器(F1,F2,.....,F8)产生8个信息指纹(f1,f2,....,f8).再用一个随机数产生器G把这八个信息指纹映射到1到16亿中的8个自然数g1,g2,...,g8。现在把这8个位置的二进制位全部变为1。这样一个布隆过滤器就建好了 


示例代码

[java]  view plain  copy
  1. import java.util.BitSet;    
  2.     
  3. /**  
  4.  *  
  5.  * @author xkey  
  6.  */    
  7. public class BloomFilter {    
  8.     
  9.     private static final int DEFAULT_SIZE = 2 << 24;//布隆过滤器的比特长度    
  10.     private static final int[] seeds = {3,5,71113313761};//这里要选取质数,能很好的降低错误率    
  11.     private static BitSet bits = new BitSet(DEFAULT_SIZE);    
  12.     private static SimpleHash[] func = new SimpleHash[seeds.length];    
  13.     
  14.     public static void addValue(String value)    
  15.     {    
  16.         for(SimpleHash f : func)//将字符串value哈希为8个或多个整数,然后在这些整数的bit上变为1    
  17.             bits.set(f.hash(value),true);    
  18.     }    
  19.         
  20.     public static void add(String value)    
  21.     {    
  22.         if(value != null) addValue(value);    
  23.     }    
  24.         
  25.     public static boolean contains(String value)    
  26.     {    
  27.         if(value == nullreturn false;    
  28.         boolean ret = true;    
  29.         for(SimpleHash f : func)//这里其实没必要全部跑完,只要一次ret==false那么就不包含这个字符串    
  30.             ret = ret && bits.get(f.hash(value));    
  31.         return ret;    
  32.     }    
  33.         
  34.     public static void main(String[] args) {    
  35.         String value = "xkeyideal@gmail.com";    
  36.         for (int i = 0; i < seeds.length; i++) {    
  37.             func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);    
  38.         }    
  39.         add(value);    
  40.         System.out.println(contains(value));    
  41.     }    
  42. }    
  43.     
  44. class SimpleHash {//这玩意相当于C++中的结构体    
  45.     
  46.     private int cap;    
  47.     private int seed;    
  48.     
  49.     public  SimpleHash(int cap, int seed) {    
  50.         this.cap = cap;    
  51.         this.seed = seed;    
  52.     }    
  53.     
  54.     public int hash(String value) {//字符串哈希,选取好的哈希函数很重要    
  55.         int result = 0;    
  56.         int len = value.length();    
  57.         for (int i = 0; i < len; i++) {    
  58.             result = seed * result + value.charAt(i);    
  59.         }    
  60.         return (cap - 1) & result;    
  61.     }    
  62. }    

参考:

http://www.cnblogs.com/haippy/archive/2012/07/13/2590351.html
http://blog.csdn.net/acceptedxukai/article/details/7031899
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值