`
lhjq780
  • 浏览: 4381 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
最近访客 更多访客>>
社区版块
存档分类
最新评论

【转】布隆过滤器java实现

阅读更多
可以用该算法,来实现网址过滤
/**
  * 项目名:SpiderCrawler
  * 文件名:BloomFilterTest.java
  * 作者:zhouyh
  * 时间:2014-8-29 下午02:54:56
  * 描述:TODO(用一句话描述该文件做什么) 
  */
package com.utilTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.BitSet;

/**
 * 类名: BloomFilterTest
 * 包名: com.utilTest
 * 作者: zhouyh
 * 时间: 2014-8-29 下午02:54:56
 * 描述: 布隆过滤器,传统的布隆过滤器不支持从集合中删除成员
 */
public class BloomFilterTest {
	//DEFAULT_SIZE为2的29次方,即此处的左移28位
	private static final int DEFAULT_SIZE = 2<<28;
	/*
	 * 不同哈希函数的种子,一般取质数
	 * seeds数组共有8个值,则代表采用8种不同的哈希函数
	 */
	private int[] seeds = new int[]{3, 5, 7, 11, 13, 31, 37, 61};
	/*
	 * 初始化一个给定大小的位集
	 * BitSet实际是由“二进制位”构成的一个Vector。
	 * 假如希望高效率地保存大量“开-关”信息,就应使用BitSet.
	 */
	private BitSet bitSets = new BitSet(DEFAULT_SIZE);
	//构建hash函数对象
	private SimpleHash[] hashFuns = new SimpleHash[seeds.length];
	//布隆过滤器配置文件存放路径
	private String path = "";
	
	public BloomFilterTest(String path){
		/**
		 *  给出所有的hash值,共计seeds.length个hash值。共8位。
		 *  通过调用SimpleHash.hash(),可以得到根据8种hash函数计算得出hash值。	
		 *  传入DEFAULT_SIZE(最终字符串的长度),seeds[i](一个指定的质数)即可得到需要的那个hash值的位置。		
		 */
		for(int i=0; i<seeds.length; i++){
			hashFuns[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
		}
		//配置文件路径地址
		this.path = path;
	}
	/**
	 * 
	 * 方法名:add
	 * 作者:zhouyh
	 * 创建时间:2014-8-30 下午02:07:35
	 * 描述:将给定的字符串标记到bitSets中,即设置字符串的8个函数值的位置为1
	 * @param value
	 */
	public synchronized void add(String value){
		for(SimpleHash hashFun : hashFuns){
			bitSets.set(hashFun.hash(value), true);
		}
	}
	/**
	 * 
	 * 方法名:isExit
	 * 作者:zhouyh
	 * 创建时间:2014-8-30 下午02:12:30
	 * 描述:判断给定的字符串是否已经存在在bloofilter中,如果存在返回true,不存在返回false
	 * @param value
	 * @return
	 */
	public synchronized boolean isExit(String value){
		//判断传入的值是否为null
		if(null == value){
			return false;
		}
		
		for(SimpleHash hashFun : hashFuns){
			if(!bitSets.get(hashFun.hash(value))){
				//如果判断8个hash函数值中有一个位置不存在即可判断为不存在Bloofilter中
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 
	 * 方法名:init
	 * 作者:zhouyh
	 * 创建时间:2014-8-30 下午02:28:49
	 * 描述:读取配置文件
	 */
	public void init(){
		File file = new File(path);
		FileInputStream in = null;
		try {
			in = new FileInputStream(file);
			long lt = System.currentTimeMillis();
			read(in);
			System.out.println(System.currentTimeMillis()-lt);
			System.out.println(Runtime.getRuntime().totalMemory());
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try {
				if(in!=null){
					in.close();
					in = null;
				}			
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 
	 * 方法名:read
	 * 作者:zhouyh
	 * 创建时间:2014-8-30 下午02:26:59
	 * 描述:根据传入的流,初始化bloomfilter
	 * @param in
	 */
	private void read(InputStream in){
		if(null == in){	//如果in为null,则返回
			return;
		}
		
		int i = 0;
		InputStreamReader reader = null;
		
		try {
			//创建输入流
			reader = new InputStreamReader(in, "UTF-8");
			BufferedReader buffReader = new BufferedReader(reader, 512);
			String theWord = null;			
			do {
				i++;			
				theWord = buffReader.readLine();
				//如果theWord不为null和空,则加入Bloomfilter中
				if(theWord!=null && !theWord.trim().equals("")){
					add(theWord);
				}
				if(i%10000 == 0){
					System.out.println(i);
				}
				
			} while (theWord != null);
			
		} catch (IOException e){
			e.printStackTrace();
		} finally{
			//关闭流
			try {
				if(reader != null){
					reader.close();
					reader = null;
				}				
				if(in != null){
					in.close();
					in = null;
				}
			} catch (IOException e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			
		}
	}
	
	/**
	 * 方法名:main
	 * 作者:zhouyh
	 * 创建时间:2014-8-29 下午02:54:56
	 * 描述:TODO(这里用一句话描述这个方法的作用)
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BloomFilterTest bloomFilterTest = new BloomFilterTest("f:/fetchedurls.txt");
		bloomFilterTest.init();
		
		System.out.println(bloomFilterTest.isExit("http://www.plating.org/news_info.asp?pid=28&id=2857"));
	}
	
	public static class SimpleHash {
		/*
		 * cap为DEFAULT_SIZE,即用于结果的最大字符串的值
		 * seed为计算hash值的一个key值,具体对应上文中的seeds数组
		 */
		private int cap;
		private int seed;
		/**
		 * 
		 * 构造函数
		 * 作者:zhouyh
		 * @param cap
		 * @param seed
		 */
		public SimpleHash(int cap, int seed){
			this.cap = cap;
			this.seed = seed;
		}
		/**
		 * 
		 * 方法名:hash
		 * 作者:zhouyh
		 * 创建时间:2014-8-30 下午01:47:10
		 * 描述:计算hash的函数,用户可以选择其他更好的hash函数
		 * @param value
		 * @return
		 */
		public int hash(String value){
			int result = 0;
			int length = value.length();
			for(int i=0; i<length; i++){
				result = seed*result + value.charAt(i);
			}
			
			return (cap-1) & result;
		}
	}

}

 转自:http://blog.csdn.net/hwwzyh/article/details/38944513

分享到:
评论

相关推荐

    布隆过滤器 java实现代码

    布隆过滤器 源码 java版 /** * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software ...

    java实现的布隆过滤器算法

    在提供的压缩包文件`Bloom Filter`中,可能包含了具体的Java实现代码,你可以通过阅读和分析这些代码来深入理解布隆过滤器的工作原理和Java实现细节。此外,还可以通过测试不同参数组合下的性能,进一步了解布隆过滤...

    布隆过滤器BloomFilters的一个简单Java库

    总的来说,`jbloomer`库提供的布隆过滤器Java实现,简化了开发人员在项目中集成这一高效数据结构的过程,有助于提高系统的性能和效率。在处理大量数据时,合理使用布隆过滤器可以有效降低内存消耗,同时保持较高的...

    布隆过滤器的实现,以及测试用例,简单易懂并做了一些注释

    下面将详细介绍布隆过滤器的原理、实现及测试用例。 ### 布隆过滤器原理 1. **基本结构**:布隆过滤器是一个很长的二进制数组和几个独立的哈希函数。数组初始全为0,哈希函数是随机且独立的。 2. **插入操作**:...

    简单实现的布隆过滤器

    自动清空过滤器内部信息的使用比率,传null则表示不会自动清理,当过滤器使用率达到100%时,则无论传入什么数据,都会认为在数据已经存在了当希望过滤器使用率达到80%时自动清空重新使用,则传入0.8

    布隆过滤器-详说布隆过滤器.pdf

    在Java中,可以使用Guava库中的布隆过滤器来实现布隆过滤器。Guava的布隆过滤器提供了put和mayContain方法,可以任意类型的数据转化成Java基本数据类型,并且可以设置哈希函数的个数、位数组的长度和允许的误差率。 ...

    Java 实现的高性能布隆过滤器!.zip

    Java 实现的高性能布隆过滤器!.zip,Advanced Bloom Filter Based Algorithms for Efficient Approximate Data De-Duplication in Streams

    【技术分享】Bloomfilter布隆过滤器.pptx

    Redisson是一个Java客户端,它不仅支持Redis的各种功能,还包含了布隆过滤器的实现。通过使用Redisson,用户可以在分布式环境中利用布隆过滤器,提高系统的可扩展性和效率。 总的来说,布隆过滤器是一种在空间效率...

    布隆过滤器-BloomFilter

    在Java中,实现布隆过滤器可以使用开源库如Guava或者自定义实现。例如,`BloomFilter.java`和`MyBloomFilter.java`可能是两个不同的实现版本。自定义实现通常包括以下几个关键部分: 1. **位数组(Bit Array)**:...

    基于redis的布隆过滤器实现.zip

    总结来说,"基于redis的布隆过滤器实现.zip"提供了一种使用Java实现的Redis布隆过滤器示例,帮助开发者理解如何在实际项目中利用Redis-Bloom插件进行数据过滤和去重,从而提高系统效率。通过学习和分析这个示例,...

    安装布隆过滤器,布隆过滤器压缩包

    在Java中,我们可以利用开源库如RedisBloom来实现布隆过滤器的功能。 RedisBloom是一个扩展Redis功能的模块,提供了布隆过滤器的数据类型,使得在Redis中存储和查询数据时能够利用布隆过滤器的特性,有效避免不必要...

    JAVA实现较完善的布隆过滤器的示例代码

    JAVA实现较完善的布隆过滤器的示例代码 本文主要介绍了JAVA实现较完善的布隆过滤器的示例代码,该代码实现了一个高效的布隆过滤器,用于判断一个元素是否在一个集合中。布隆过滤器是一种空间效率高、查询速度快的...

    PDD–基于高级布隆过滤器算法用于高效得删除数据流中的近似重复数据

    综上所述,PDD算法是基于布隆过滤器的一种高级实现,专为高效处理数据流中的重复数据设计。它可能在Java环境中实现,尤其适用于处理地理数据。通过理解和应用这种算法,开发者能够有效地管理和分析大规模数据流,...

    Java实现布隆过滤器的方法步骤

    布隆过滤器是一种概率型数据...总的来说,Java实现布隆过滤器的关键在于合理选择位数组的大小和哈希函数,以平衡空间占用和误判率。通过这种方式,可以在有限的空间内处理大规模数据的近似查询,从而提高系统的效率。

    布隆过滤器 2.2.12

    布隆过滤器是一种概率型数据结构,用于判断一个元素是否可能在一个集合中。在 Redis 缓存系统中,它常被用来缓解缓存穿透问题,防止数据库受到不必要的查询压力。缓存穿透是指用户请求的数据既不在缓存中也不在...

    springboot_redis

    6. **消息队列支持**:Redis也可以作为消息中间件,Spring Boot提供了`RedisMessageListenerContainer`和`SimpleMessageConverter`等组件来实现发布/订阅模式。 7. **Sentinel或Cluster支持**:如果需要高可用性,...

    Java实现短链转换项目

    本项目是基于Java技术栈,利用SpringBoot框架、Redis缓存系统、MySQL数据库以及布隆过滤器来实现短链转换。下面我们将详细探讨这些技术在该项目中的应用和实现原理。 首先,**SpringBoot** 是一个由Pivotal团队提供...

    Python-cljcbloom一个用Clojure脚本实现的跨平台布隆过滤器

    Python-cljcbloom项目是基于Clojure语言实现的一个跨平台的布隆过滤器库,它允许Python开发者利用Clojure的优势来处理大规模数据的去重问题。 1. **布隆过滤器原理**: 布隆过滤器由一块位数组和几个独立的哈希...

    布隆过滤器(Bloom Filter)的Java实现方法

    【布隆过滤器(Bloom Filter)的Java实现】 布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。它可能会产生误报(false positive),但不会产生漏报(false negative)。在Java...

    test-bloomfilter.zip

    在本项目中,我们将探讨如何在Java环境下,利用SpringBoot框架和Redis来实现布隆过滤器,具体分为两种方法:使用Redisson客户端和通过Lua脚本直接在Redis服务器端执行。 首先,我们来了解Redisson客户端的使用。...

Global site tag (gtag.js) - Google Analytics