SimpleBloomFilter 持久化

当前位置 : 首页 > 网页制作 > CSS > SimpleBloomFilter 持久化

SimpleBloomFilter 持久化

来源: 作者: 时间:2016-02-16 10:04
[html]package bloom;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectI...

[] 
package bloom; 
 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.util.BitSet; 
 
/** 
 * @author Keeny (2013-1-2) 
 **/ 
public class SimpleBloomFilter { 
    private static final int DEFAULT_SIZE = 2 << 24; 
    private static final int[] seeds = new int[] { 7, 11, 13, 31, 37, 61, }; 
    private BitSet bits = new BitSet(DEFAULT_SIZE); 
    private SimpleHash[] func = new SimpleHash[seeds.length]; 
 
    public static void main(String[] args) { 
        String fileName = "d:\\bloom\\BloomFilter.txt"; 
        String value = ""; 
        SimpleBloomFilter filter = new SimpleBloomFilter(); 
        BitSet bitSet = filter.readBit(fileName); 
        filter.setBits(bitSet); 
 
        System.out.println(filter.contains(value)); 
        filter.add(value); 
        System.out.println(filter.contains(value)); 
 
        filter.saveBit(fileName); 
    } 
 
    public void setBits(BitSet bits) { 
        this.bits = bits; 
    } 
 
    public void saveBit(String filename) { 
 
        try { 
            File file = new File(filename); 
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file, false)); 
            oos.writeObject(bits); 
            oos.flush(); 
            oos.close(); 
        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
 
    public BitSet readBit(String filename) { 
        BitSet bits = new BitSet(DEFAULT_SIZE); 
        File file = new File(filename); 
        if (!file.exists()) { 
            return bits; 
        } 
        try { 
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); 
            bits = (BitSet) ois.readObject(); 
            ois.close(); 
 
        } catch (FileNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } 
        return bits; 
    } 
 
    public SimpleBloomFilter() { 
        for (int i = 0; i < seeds.length; i++) { 
            func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]); 
        } 
    } 
 
    // 覆盖方法,把URL 添加进来 
    public void add(String value) { 
        for (SimpleHash f : func) { 
            bits.set(f.hash(value), true); 
        } 
    } 
 
    // 覆盖方法,是否包含URL 
    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; 
        } 
 
        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; 
        } 
    } 

package bloom;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.BitSet;

/**
 * @author Keeny (2013-1-2)
 **/
public class SimpleBloomFilter {
 private static final int DEFAULT_SIZE = 2 << 24;
 private static final int[] seeds = new int[] { 7, 11, 13, 31, 37, 61, };
 private BitSet bits = new BitSet(DEFAULT_SIZE);
 private SimpleHash[] func = new SimpleHash[seeds.length];

 public static void main(String[] args) {
  String fileName = "d:\\bloom\\BloomFilter.txt";
  String value = "";
  SimpleBloomFilter filter = new SimpleBloomFilter();
  BitSet bitSet = filter.readBit(fileName);
  filter.setBits(bitSet);

  System.out.println(filter.contains(value));
  filter.add(value);
  System.out.println(filter.contains(value));

  filter.saveBit(fileName);
 }

 public void setBits(BitSet bits) {
  this.bits = bits;
 }

 public void saveBit(String filename) {

  try {
   File file = new File(filename);
   ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file, false));
   oos.writeObject(bits);
   oos.flush();
   oos.close();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public BitSet readBit(String filename) {
  BitSet bits = new BitSet(DEFAULT_SIZE);
  File file = new File(filename);
  if (!file.exists()) {
   return bits;
  }
  try {
   ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
   bits = (BitSet) ois.readObject();
   ois.close();

  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  return bits;
 }

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

 // 覆盖方法,把URL 添加进来
 public void add(String value) {
  for (SimpleHash f : func) {
   bits.set(f.hash(value), true);
  }
 }

 // 覆盖方法,是否包含URL
 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;
  }

  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;
  }
 }
}


 

Tag:

相关文章

网友评论

<