0

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

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

4

1 回答 1

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);
    }
}
于 2016-03-10T18:36:26.453 回答