Сравните Guava Bloom Filters?
В любом случае можно сравнить, присутствуют ли элементы одного фильтра Блума в другом фильтре Блума. Я знаю, что вы можете использовать.equals, но это не учитывает, например, если во втором фильтре Bloom присутствуют только некоторые элементы, что я и собираюсь сделать.
Как-нибудь сравнить установленные биты?
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);
}
}