我有一个CIDR格式的文件,像这样:
每个字符串IP地址的转换都使用以下代码:
考虑到有超过500万条记录
更新:我发现了这个Peerblock项目(已经有超过100万次下载,所以我认为它必须有一些快速算法):http://code.google.com/p/peerblock/source/browse/trunk/src/pbfilter/filter_wfp.c 有人知道该项目用于创建范围列表然后搜索它们的技术吗?
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可能来自多个范围,只需要第一个即可。数据是只读的。找到ipToBefiltered
所属范围的最快方法是什么?结构将完全存储在内存中,因此不需要数据库查找。更新:我发现了这个Peerblock项目(已经有超过100万次下载,所以我认为它必须有一些快速算法):http://code.google.com/p/peerblock/source/browse/trunk/src/pbfilter/filter_wfp.c 有人知道该项目用于创建范围列表然后搜索它们的技术吗?