无论如何要比较一个布隆过滤器中是否存在一个布隆过滤器的元素。我知道你可以使用.equals但是这并没有考虑,例如,如果第二个Bloom过滤器中只有一些元素存在,那就是我想要做的事情。
以某种方式比较设置位?
答案 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);
}
}