赞
踩
详情见注释:
- import java.util.BitSet;
-
- /**
- * 布隆过滤器:用BitSet实现,建议先了解BitSet数据结构的常见方法。
- */
- public class BloomFilter {
-
- /**
- * 位数组的大小
- */
- // private static final int DEFAULT_SIZE = 2 << 24; 代表bitset中实际位数的总个数,这种情况个数很多很多基本布隆不会判断失误
- private static final int DEFAULT_SIZE = 5; //只有5位的情况下,布隆容易判断错误。
-
- /**
- * 通过这个数组可以创建 6 个不同的哈希函数
- */
- private static final int[] SEEDS = new int[]{3, 13, 46, 71, 91, 134};
-
- /**
- * 位数组。数组中的元素只能是 0 或者 1
- */
- private BitSet bits = new BitSet(DEFAULT_SIZE);
-
- /**
- * 存放包含 hash 函数的类的数组
- */
- private SimpleHash[] func = new SimpleHash[SEEDS.length];
-
- /**
- * 初始化多个包含 hash 函数的类的数组,每个类中的 hash 函数都不一样
- */
- public BloomFilter() {
- // 初始化多个不同的 Hash 函数
- for (int i = 0; i < SEEDS.length; i++) {
- func[i] = new SimpleHash(DEFAULT_SIZE, SEEDS[i]);
- }
- }
-
- /**
- * 添加元素到位数组
- */
- public void add(Object value) {
- for (SimpleHash f : func) {
- bits.set(f.hash(value), true);
- }
- }
-
- /**
- * 判断指定元素是否存在于位数组
- */
- public boolean contains(Object value) {
- boolean ret = true;
- for (SimpleHash f : func) {
- ret = ret && bits.get(f.hash(value));
- }
- return ret;
- }
-
- /**
- * 静态内部类。用于 hash 操作!
- */
- public static class SimpleHash {
-
- private int cap;
- private int seed;
-
- public SimpleHash(int cap, int seed) {
- this.cap = cap;
- this.seed = seed;
- }
-
- /**
- * 计算 hash 值
- */
- public int hash(Object value) {
- int h;
- return (value == null) ? 0 : Math.abs(seed * (cap - 1) & ((h = value.hashCode()) ^ (h >>> 16)));
- //通过混入seed的值来产生5种不同的hash函数。
- }
-
-
- public static void main(String[] args) {
- String value1 = "https://javaguide.cn/"; //故意混淆布隆过滤器,检测其准确性。
- String value2 = "https://github.com/Snailclimb";//干扰准确性
-
- String value3 = "https://jaavguide.cn/";
- String value4 = "https://javaguie.cn/";
- String value5 = "https://javaguid.cn/";
- String value6 = "https://javagide.cn/";
-
- String value10 = "https://javavguide.cn/";//这个值来检测 当布隆过滤器判断错误的情况
-
- BloomFilter filter = new BloomFilter();
- System.out.println(filter.contains(value1));
- filter.add(value1);
- filter.add(value2);
- filter.add(value3);
- filter.add(value4);
- filter.add(value5);
- filter.add(value6);
- System.out.println(filter.contains(value1));
- System.out.println(filter.contains(value3));
- System.out.println(filter.contains(value10)); //这个值来检测 当布隆过滤器判断错误的情况
- //输出true即为判断失误的情况。
-
-
- }
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。