2017-10-24 14 views
0

IPアドレスがCIDRのnotated IP範囲のリストに含まれているかどうかを確認する方法を探しています。IPリストがIP範囲(CIDR表記)のリストにあるかどうかを確認するための短時間の方法

from netaddr import IPNetwork, IPAddress 

    for CIDR in CIDRLIST: 
     if IPAddress(row[0]) in IPNetwork(CIDR): 
      print('success') 

しかしこのソリューションはあまりにも遅い私の問題のためである(800は、IPがCIDRの範囲であると500.000のIP住所が):私は、使用netaddrのように前の例を見てきました。

これをより速く行う方法はありますか?私はpytriesの使用について読んだことがありますが、これが解決策であるとは確信していません。

+0

ループの代わりにリストの理解を使用して、パフォーマンスが向上するかどうかを確認します。 – utengr

+0

私はあなたが "Van Emde Boas Tree"をあらゆる種類のパフォーマンスを備えたPythonで実装できるかどうか疑問です。 – Surt

+0

私は同じ問題を抱えています。答えは木のリストを前処理してツリーを検索することです。私はこのことを学んだのは40年です。私はKnuth Volume 3に相談しなければなりません。ありがたいことに、ITのいくつかのことは変わりません!私は、ブロック内のすべての可能なIP用のキーを持つツリーを構築する必要があるので、vEBツリーがうまくいくとは思わない。 (私がWikipediaの記事を正しく理解していると仮定して)。 –

答えて

1

Patricia/Radix tree/triesが答えのようです。ルーティングテーブルを検索するためのアルゴリズムを検索して、それらを見つけました。

Pythonの実装hereがあります。

少し後:私が今持っているこのRubyで細かい作業:

 
require 'rpatricia' 
require 'uoainfoblox' 

ib = UoAIinfoblox.new ({'user' => 'xxxxx', 'password' => 'yyyy', 'host' => 'ipam.auckland.ac.nz'}) 

pt = Patricia.new 

ib.get_networks('*roaming_network=true').each do |net, info | 
    pt.add(net) 
end 

puts "'130.216.66.65 #{ pt.include?('130.216.66.65')}" 
puts "130.216.5.128 #{pt.include?('130.216.5.128') }" 

のInfobloxは、IP管理システムであり、UoAInfobloxが自分のWeb APIのラッパーです。ここで私はローミングネットワークのリストを手に入れてpatriciaツリーに追加し、2つのIPアドレスを確認します。

編集:私はちょうどPythonを使用し、彼の研究スクリプトでpython基数モジュールを使用して私たちのCS部門のネットワークを教える友人から知っている。私は彼がCAIDAのために/ 8の暗証番号から大量のデータを処理していたことを知っています。

関連する問題