比较番石榴布隆过滤器?
Compare Guava Bloom Filters?
是否可以比较一个布隆过滤器的元素是否存在于另一个布隆过滤器中。我知道你可以使用 .equals 但这不考虑,例如,如果第二个 Bloom 过滤器中只有一些元素存在,这正是我想要做的。
以某种方式比较设置位?
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);
}
}
是否可以比较一个布隆过滤器的元素是否存在于另一个布隆过滤器中。我知道你可以使用 .equals 但这不考虑,例如,如果第二个 Bloom 过滤器中只有一些元素存在,这正是我想要做的。
以某种方式比较设置位?
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);
}
}