我有像这样的 CIDR 格式的文件,192.168.1.0/24
它被转换成这两列结构
3232236030 3232235777
每个字符串 IP 地址转换都使用以下代码进行:
String subnet = "192.168.1.0/24";
SubnetUtils utils = new SubnetUtils(subnet);
Inet4Address a = (Inet4Address) InetAddress.getByName(utils.getInfo().getHighAddress());
long high = bytesToLong(a.getAddress());
Inet4Address b = (Inet4Address) InetAddress.getByName(utils.getInfo().getLowAddress());
long low = bytesToLong(b.getAddress());
private static long bytesToLong(byte[] address) {
long ipnum = 0;
for (int i = 0; i < 4; ++i) {
long y = address[i];
if (y < 0) {
y += 256;
}
ipnum += y << ((3 - i) * 8);
}
return ipnum;
}
考虑有超过 500 万个(low high : 3232236030 3232235777)
.
还会有相交,因此 IP 可以来自多个范围。只是第一个就OK了。
数据是只读的。
找到ipToBefiltered
所属范围的最快方法是什么?该结构将完全在内存中,因此没有数据库查找。
更新:
我找到了这个Peerblock项目(它有超过一百万的下载量,所以我认为它必须有一些快速算法): http://code.google.com/p/peerblock/source/browse/trunk/src/pbfilter/filter_wfp。 C