比较番石榴布鲁姆过滤器?

时间:2016-03-09 23:58:47

标签: filter guava bitarray bloom-filter bitvector

无论如何要比较一个布隆过滤器中是否存在一个布隆过滤器的元素。我知道你可以使用.equals但是这并没有考虑,例如,如果第二个Bloom过滤器中只有一些元素存在,那就是我想要做的事情。

以某种方式比较设置位?

1 个答案:

答案 0 :(得分:0)

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