Сравните 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);
    }
}
Другие вопросы по тегам