布隆過濾器java實現

來源:互聯網
上載者:User

網上有很多的原理解釋說明,此處不再對bloom filter做過多的說明,直接上代碼(註:代碼參考了網上其他部落格的實現,比如布隆過濾器(Bloom Filter)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種hashFunction Compute得出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){//判斷傳入的值是否為nullif(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 blocke.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 exceptione.printStackTrace();}}}/** * 方法名:main * 作者:zhouyh * 建立時間:2014-8-29 下午02:54:56 * 描述:TODO(這裡用一句話描述這個方法的作用) * @param args */public static void main(String[] args) {// TODO Auto-generated method stubBloomFilterTest 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;}}}
實際使用中,效果還不錯,主要用在了爬蟲(crawler)對網址的判重上

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.