У меня есть файл в формате 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;
}
Учтите, что существует более 5 миллионов записей (low high : 3232236030 3232235777)
.
Также будут пересечения, поэтому IP-адрес может происходить из нескольких диапазонов. Только с первым более чем ОК.
Данные доступны только для чтения.
Как быстрее всего найти диапазон, к которому принадлежит ipToBefiltered
? Структура будет полностью в памяти, поэтому поиск в базе данных не потребуется.
ОБНОВИТЬ:
Я нашел этот проект Peerblock (у него более миллиона загрузок, поэтому я думаю, несколько быстрых алгоритмов): http://code.google.com/p/peerblock/source/browse/trunk/src/pbfilter/filter_wfp.c
find the range the ipToBefiltered belongs to?
Вы хотите знать диапазоны, в которых находится данный IP-адрес, а не только T/F, независимо от того, находится ли он в каком-то определенном диапазоне? - person Stephen P   schedule 29.11.2011