package org.limewire.net.collection; import java.net.InetAddress; import java.util.BitSet; import org.limewire.io.NetworkUtils; /** * A bloom filter for compact memory representation of a set of * masked ips. * /32 (individual ip) = 512 MB * /24 (class C) = 2 MB * /16 (class B) = 64 KB */ public class MaskedIPSet extends BitSet { private static final long serialVersionUID = 8152241226787435317L; private static final int IPV4_SIZE = 32; private final int mask; public MaskedIPSet(int mask) { super(assertMask(mask)); this.mask = IPV4_SIZE - mask; } private static int assertMask(int size) { assert size <= IPV4_SIZE; return (0x1 << size); } public void set(InetAddress addr) { set(ipV4ToInt(addr)); } public void setInt(int ip) { set(intToMasked(ip)); } public boolean get(InetAddress addr) { return get(ipV4ToInt(addr)); } public boolean getInt(int ip) { return get(intToMasked(ip)); } public synchronized boolean getAndSet(InetAddress addr) { int index = ipV4ToInt(addr); boolean ret = get(index); set(index); return ret; } private int intToMasked(int ip) { int ret = ((ip & (0xFFFFFFFF << mask)) >>> mask); assert ret < (0x1 << (32 - mask)); return ret; } private int ipV4ToInt(InetAddress addr) { return intToMasked(NetworkUtils.getMaskedIP(addr, 0xFFFFFFFF)); } }