2016-03-09 84 views
0

无论如何比较一个布隆过滤器的元素是否存在于另一个布隆过滤器中。我知道你可以使用.equals,但这并不考虑,例如,如果只有一些元素出现在第二个布隆过滤器中,那么我正在寻找。比较番石榴花过滤器?

以某种方式比较设置位?

回答

0

谷歌番石榴不具有内置的支持,这也不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); 
    } 
}