[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.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 = "stone2083@yahoo.cn";
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 = "stone2083@yahoo.cn";
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;
}
}
}