2016-03-09 124 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); 
    } 
}