2012-04-19 32 views
2

私は、IP範囲をCIDR表記のリストIPに変換するアルゴリズムを開発しています(これ以降のタプルで説明します)。 今、私はこの変換の最悪ケースシナリオが何かを考え出しています。IP範囲からCIDRマスクへの変換

IPv4範囲で取得できるタプルの最大数はいくらですか? IPv6範囲で取得できるタプルの最大数はいくらですか? ?

1 #!/usr/bin/env python 
2 
3 import sys 
4 import re 
5 
6 def ip2int(ip) : 
7   ret = 0 
8   match = re.match("(\d*)\.(\d*)\.(\d*)\.(\d*)", ip) 
9   if not match : return 0 
10   for i in xrange(4) : ret = (ret << 8) + int(match.groups()[i]) 
11   return ret 
12 
13 def int2ip(ipnum) : 
14   ip1 = ipnum >> 24 
15   ip2 = ipnum >> 16 & 0xFF 
16   ip3 = ipnum >> 8 & 0xFF 
17   ip4 = ipnum & 0xFF 
18   return "%d.%d.%d.%d" % (ip1, ip2, ip3, ip4) 
19 
20 def printrange(startip, endip) : 
21   bits = 1 
22   mask = 1 
23   while bits < 32 : 
24     newip = startip | mask 
25     if (newip>endip) or (((startip>>bits) << bits) != startip) : 
26       bits = bits - 1 
27       mask = mask >> 1 
28       break 
29     bits = bits + 1 
30     mask = (mask<<1) + 1 
31   newip = startip | mask 
32   bits = 32 - bits 
33   print "%s/%d" % (int2ip(startip), bits) 
34   if newip < endip : 
35     printrange(newip + 1, endip) 
36 
37 while 1 : 
38   line = sys.stdin.readline().strip() 
39   if not line : break 
40   chars = line.split(" ") 
41   print "#%s - %s" % (chars[0], chars[1]) 
42   ip1 = ip2int(chars[0]) 
43   ip2 = ip2int(chars[1]) 
44   printrange(ip1, ip2) 
+0

CではPythonよりも効率的なアルゴリズムがあります。なぜならC言語では単一のCPU命令として実行される[ffs and fls](http://en.wikipedia.org/wiki/Find_first_set)関数があるからです。サンプル[IPv4用](https://gist.github.com/4202877) – citrin

答えて

0

それは単なる推測ですが、あると思われる、CIDRプレフィックスのためのその最大数:この計算ERP

は私が(再帰的ではありません)修正Cバージョンof the following Python scriptを使用していたどのように 単一IPv4範囲では62(32 * 2 - 2)、IPv6 - 254(128 * 2 - 2)になります。

関連する問題