2016-07-07 4 views
1

IPアドレスがサブネットに属しているかどうかを確認します。/3から/ 31、数百万回/秒の範囲のサブネットを持つ300.000個のCIDRブロックをチェックする必要があるときに痛みが生じます。 300.000各ブロックのすべてについてIPがサブネット内にあるかどうかの最適なチェック

Iでしip.cidrSubnet('ip/subnet')をし、私が探しているIPが最初の最後のアドレス範囲内にあるかどうかを確認するが、これは非常に高価です:

は、例えばhttps://github.com/indutny/node-ipしてください。

IPアドレスがこれらのブロックのいずれかに属しているかどうかを、毎回ルーピングすることなく最適にチェックできますか?

答えて

1

範囲チェックに最適化されたバイナリツリーに情報を格納します。

これを実行する単純な方法の1つは、各CIDRブロックをイベントのペアにすることです.1つはブロックを入力するとき、もう1つはブロックを終了するときです。次に、イベントのリストをIPアドレスでソートします。これを実行してIPアドレスとブロック数をソートした配列を作成します。300,000個のCIDRブロックの場合、60万のイベントがあり、検索は19-20回の検索となります。

このファイルのバイナリ検索を実行して、現在のIPアドレスより前の最後のトランジションを検索し、それが1つ以上のブロックにあるかどうかに応じてtrue/falseを返します。

ファイルを検索する代わりに、何らかの専用インデックスを検索していると、検索が高速になります。 (検索のルックアップの数は同じか少し多めですが、CPUキャッシュをより良く使います)私は個人的にBerkeleyDBのBTreeデータ構造を他の言語のこの種のものに使用しており、非常に満足しています。

関連する問題