このようなCIDR形式のファイルがあり192.168.1.0/24
、この2列の構造に変換されます
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プロジェクトを見つけました(100 万回以上ダウンロードされているので、高速なアルゴリズムが必要だと思います): http://code.google.com/p/peerblock/source/browse/trunk/src/pbfilter/filter_wfp。 c