`

Bloom filter

 
阅读更多

Bloom filter的优点:

 

  1. 大小固定,增加更多元素到一个Bloom filter不会增加它的大小,仅增加误报的概率
  2. 冲突概率低,为了降低冲突概率,Bloom filter引入多个Hash函数,其误报率可近似为:1-exp(-kn/m)
Java实现:
import java.util.BitSet;

public class BloomFilter {
	/* BitSet初始分配2^24个bit */
	private static final int DEFAULT_SIZE = 1 << 25;
	/* 不同哈希函数的种子,一般应取质数 */
	private static final int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61 };
	private BitSet bits = new BitSet(DEFAULT_SIZE);
	/* 哈希函数对象 */
	private SimpleHash[] func = new SimpleHash[seeds.length];

	public BloomFilter() {
		for (int i = 0; i < seeds.length; i++) {
			func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
		}
	}

	// 将字符串标记到bits中
	public void add(String value) {
		for (SimpleHash f : func) {
			bits.set(f.hash(value), true);
		}
	}

	// 判断字符串是否已经被bits标记
	public boolean contains(String value) {
		if (value == null) {
			return false;
		}
		boolean ret = true;
		for (SimpleHash f : func) {
			ret = ret && bits.get(f.hash(value));
		}
		return ret;
	}

	/* 哈希函数类 */
	public static class SimpleHash {
		private int cap;
		private int seed;

		public SimpleHash(int cap, int seed) {
			this.cap = cap;
			this.seed = seed;
		}

		// hash函数,采用简单的加权和hash
		public int hash(String value) {
			int result = 0;
			int len = value.length();
			for (int i = 0; i < len; i++) {
				result = seed * result + value.charAt(i);
			}
			return (cap - 1) & result;
		}
	}
}
 

 

 

1
2
分享到:
评论
1 楼 jyltiger813 2012-05-15  
这个实现存在问题
多个seeds对应一个BitSet,会增加hash碰撞冲突的概率,既增加误判为已包含的概率
正确的做法应该是一个seed对应一个BitSet
多个BitSet只要有一个不包含既判断为不包含,降低误判概率

public class CompanyBloom implements Serializable{
	/**
	 * 
	 */
	
		
	private static final long serialVersionUID = 1L;
	/* BitSet初始分配2^24个bit */
	private static final int DEFAULT_SIZE = 1 << 933433;// 933433;
	/* 不同哈希函数的种子,一般应取质数 */
	private static final int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61};//,73,103,109, 319, 529, 739, 949,113, 323 ,533 ,743, 953 ,121, 331, 541 ,751 ,961,127, 337 ,547, 757, 967 ,131, 341 ,551 ,761, 971,137, 347 ,557, 767,977};//,137, 347 ,557, 767 ,977 ​​};
	HashMap<Integer,BitSet> bitMap = new HashMap<Integer,BitSet>();
//	private BitSet bits = new BitSet(DEFAULT_SIZE);
	/* 哈希函数对象 */
	private SimpleHash[] func = new SimpleHash[seeds.length];

	public CompanyBloom() {
		for (int i = 0; i < seeds.length; i++) {
			func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
			BitSet bit = new BitSet(DEFAULT_SIZE);
			bitMap.put(seeds[i], bit);
		}
		loadFromDisk();
	}

	// 将字符串标记到bits中
	public void add(String value) {
		for (SimpleHash f : func) {
			bitMap.get(f.getSeed()).set(f.hash(value), true);
		//	bits.set(f.hash(value), true);
		}
	}

	// 判断字符串是否已经被bits标记
	public boolean contains(String value) {
		if (value == null) {
			return false;
		}
		boolean ret = true;
		for (SimpleHash f : func) {
			ret = ret && bitMap.get(f.getSeed()).get(f.hash(value));
		}
		return ret;
	}

	/* 哈希函数类 */
	public static class SimpleHash {
		private int cap;
		private int seed;

		public int getSeed() {
			return seed;
		}

		public void setSeed(int seed) {
			this.seed = seed;
		}

		public SimpleHash(int cap, int seed) {
			this.cap = cap;
			this.seed = seed;
		}

		// hash函数,采用简单的加权和hash
		public int hash(String value) {
			int result = 0;
			int len = value.length();
			for (int i = 0; i < len; i++) {
				result = seed * result + value.charAt(i);
			}
			//result = result^result;
			return (cap - 1) & result;
			
		}
	}
	public static void main(String args[])
	{
		CompanyBloom bf = new CompanyBloom();
		//bf.loadFromDB();
	//	bf.add("中国人");
		long t1 = System.currentTimeMillis();
		System.out.println("isContain:"+bf.contains("中国人名"));
		System.out.println("time:"+(System.currentTimeMillis()-t1));
		System.out.println("isContain:"+bf.contains("网易"));
		//System.out.println("isContain:"+bf.contains("中国人名"));
		System.out.println("isContain:"+bf.contains("ok"));
		System.out.println("isContain:"+bf.contains("北京分公司1"));
		System.out.println("isContain:"+bf.contains("中国移动"));
		System.out.println("isContain:"+bf.contains("中国3"));
		System.out.println("isContain:"+bf.contains("新浪1"));
		System.out.println("isContain:"+bf.contains("更新日期"));
		System.out.println("isContain:"+bf.contains("计算机软件"));
	//	bf.flush2Disk();
	}

	/**
	 * 
	 */
	private void loadFromDB() {

		Connection con =getConnection();
		String sql = "  SELECT `name` FROM dic_company_name  ";
		//String sql = " SELECT `name` FROM dic_company_name ";//TODO 测试,仅用较少的一部分数据
		  try {
			Statement stmt = con.createStatement();
			  ResultSet rs = stmt.executeQuery(sql);
			  int i = 0;
			 while( rs.next())
			  {i++;
			 // System.out.println("i"+i);
				String cn_name = rs.getString(1);
				add(cn_name);
					System.out.println("i:"+i);
			  }
		} catch (SQLException e) {
			e.printStackTrace();
		}
		finally{
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}

	/**
	 * 
	 */
	private void loadFromDisk() {
		URL url = CompanyBloom.class.getResource("companyBloom");
		ObjectInputStream oin;
		try {
			oin = new ObjectInputStream(new FileInputStream(url.getFile()));
			bitMap = (HashMap<Integer, BitSet>)oin.readObject();
			oin.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		
	}

	/**
	 * 
	 */
	private void flush2Disk() {
		
				
				//试图将对象两次写入文件
				try {
					ObjectOutputStream out = new ObjectOutputStream(
							new FileOutputStream("companyBloom"));
					out.writeObject(bitMap);
					out.flush();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
		
	}
	

相关推荐

    Bloom Filter概念和原理

    ### Bloom Filter概念与原理 #### 一、Bloom Filter概述 Bloom Filter是一种高效的数据结构,主要用于快速查询一个元素是否存在于一个集合中。它通过牺牲一定的精确度来换取存储空间的极大节省。Bloom Filter的...

    leveldb中bloomfilter的优化.pdf

    ### Leveldb中Bloom Filter的优化:ElasticBF #### 概述 在现代数据库技术中,**Log-Structured Merge-tree (LSM-tree)** 结构因其高效的写入性能而被广泛应用于各种键值(Key-Value, KV)存储系统中,如Google的*...

    bloom filter

    ### Bloom Filter概述与应用 #### 一、Bloom Filter简介 Bloom Filter是一种高效的数据结构,主要用于近似地判断一个元素是否在一个集合中。它的主要特点是空间效率高,但允许存在一定的误报率(即可能会错误地...

    带bloom filter 的c网络爬虫

    - **bloomfilter.h**:这是一个头文件,很可能包含了Bloom Filter的数据结构定义和相关操作函数的声明。在C语言中,头文件通常用于提供接口给其他源文件使用,这里可能是为了在spider.c中方便地调用Bloom Filter的...

    java-bloomfilter

    BloomFilter&lt;String&gt; bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), 100000, 0.0001); // 添加元素 bloomFilter.put("element1"); bloomFilter.put("element2"); // 检查元素 ...

    Python-bloomfilter过滤器

    **Python-bloomfilter过滤器详解** Bloom Filter是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。在Python开发中,尤其是在处理大量数据时,Bloom Filter可以有效地节省内存空间,尤其适用...

    多字段矩阵型bloomfilter(支持砍维度)

    在传统的Bloom Filter中,它通常处理单一的关键字,而在“多字段矩阵型Bloom Filter”中,这一概念被扩展到了支持多个字段的情况,这使得它在处理复杂数据集时更具灵活性。 首先,我们要理解Bloom Filter的基本原理...

    Java版本的BloomFilter (布隆过滤器)

    BloomFilter&lt;String&gt; bloomFilter = BloomFilter.create(funnel, 100000, 0.03); bloomFilter.put("element1"); bloomFilter.put("element2"); System.out.println(bloomFilter.mightContain("element1")); //...

    bloom filter 相关论文资料

    布隆过滤器(Bloom Filter)是一种空间效率极高的概率数据结构,用于判断一个元素是否可能在一个集合中。它由布伦南·布隆在1970年提出,最初是为了解决查找问题中的空间效率问题。这篇论文资料集合涵盖了布隆过滤器...

    bloomfilter.js, 使用FNV的JavaScript bloom filter快速散列.zip

    bloomfilter.js, 使用FNV的JavaScript bloom filter快速散列 Bloom过滤器This过滤器实现使用非加密 Fowler-Noll-Vo散列函数来实现速度。用法var bloom = new BloomFilter( 32 * 256,//number of bits to all

    Go-Go中的CuckooFilter实现比BloomFilter更好

    在Go编程语言中,Bloom Filter和Cuckoo Filter是两种流行的数据结构,用于空间效率高的近似存在检查。本篇文章将深入探讨Cuckoo Filter如何在某些情况下优于Bloom Filter,以及Go语言中实现Cuckoo Filter的细节。 ...

    bloom filter布隆过滤器学习资料大全

    布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。在大数据处理、缓存系统、分布式存储等领域有着广泛的应用。这个压缩包文件“bloom filter布隆过滤器学习...

    BloomFilter及其应用综述

    Bloom filter是一个简明的空间效率极高的随机的数据结构。用Bloom filter 表示 cache 内容 ,可以高效地实现cache 协作。本文对BloomFilter及其改进型进行了综述性分析,探讨了它的实用性。

    基于Bloom Filter的海量数据分布式快速匹配算法研究.pdf

    2. Bloom Filter技术:Bloom Filter是一种空间效率很高的随机数据结构,它使用位数组来简洁地表示一个集合,并且能够快速判断一个元素是否属于这个集合。Bloom Filter的引入是为了高效利用数据空间,在海量数据匹配...

    Go-一个CuckooFilter的Go库BloomFilter的替代物

    本文将深入探讨标题提及的"Go-一个CuckooFilter的Go库BloomFilter的替代物",以及其背后的CuckooFilter数据结构和它如何成为BloomFilter的一种优化方案。 首先,Bloom Filter是一种空间效率极高的概率数据结构,...

    Bloom Filter of 2.5 Million common passwords

    This is the bloom filter of 2.5 Million ... BloomFilter bf=new BloomFilter(); BitSet bitSet=bf.readBit(fileName); bf.setBits(bitSet); System.out.println(bf.exist("password")); } it will says true.

    BloomFilter算法

    **Bloom Filter算法详解** Bloom Filter是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。由Burton Howard Bloom在1970年提出,它的主要特点是能够在牺牲一定的判断准确性(可能存在...

Global site tag (gtag.js) - Google Analytics