【问题标题】:Compare Guava Bloom Filters?比较番石榴布隆过滤器?
【发布时间】:2016-06-24 14:59:22
【问题描述】:

是否存在比较一个布隆过滤器的元素是否存在于另一个布隆过滤器中。我知道您可以使用 .equals ,但这没有考虑,例如,如果我想要做的第二个 Bloom 过滤器中只有一些元素存在。

以某种方式比较设置的位?

【问题讨论】:

    标签: filter guava bitarray bloom-filter bitvector


    【解决方案1】:

    Google Guava 没有对此的内置支持,BloomFilter<T> 也没有公开其支持位,因此您无法在不使用反射的情况下访问它们:

    public static <T> boolean mightContainAll(BloomFilter<T> bloomFilter, BloomFilter<T> that) {
        BitSet thisBitSet = getBitSet(bloomFilter);
        BitSet thatBitSet = getBitSet(that);
        BitSet intersectionBitSet = new BitSet(thisBitSet.size());
        intersectionBitSet.or(thisBitSet);
        intersectionBitSet.and(thatBitSet);
        return intersectionBitSet.equals(thatBitSet);
    }
    
    private static <T> BitSet getBitSet(BloomFilter<T> bloomFilter) {
        try {
            Field bitsField = BloomFilter.class.getDeclaredField("bits");
            bitsField.setAccessible(true);
            Object bitArray = bitsField.get(bloomFilter);
            Field dataField = bitArray.getClass().getDeclaredField("data");
            dataField.setAccessible(true);
            return BitSet.valueOf((long[]) dataField.get(bitArray));
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多