将 CIDR 格式的大量重叠网络压缩为 Python 中的最大公分母
Condense large list of overlapping networks in CIDR format to greatest common denominator in Python
我有一个文本文件,其中存储了我们内部使用的大量网络列表 (250k+),格式如下:
10.4.5.0/30
10.4.5.0/24
10.4.7.0/24
10.4.0.0/16
10.3.5.0/24
10.3.0.0/16
172.15.51.0/24
172.0.0.0/8
我想尝试减少列表以使处理更有效率。使用 Python,如何有效地将列表压缩到包含所有 IP 的最大子网中?是否有任何库可以使这更容易?
例如,上面的列表可以简化为:
10.4.0.0/16
10.3.0.0/16
172.0.0.0/8
作为扩展,这在 IPv6 中是否可行?
你可能想试试这个github-IPy
使用 IPSet
合并您的 IP。它适用于 ipv6。但是我不太确定性能。也许 golang 更适合这样的工作。
稍作修改的路由 trie 肯定可以,但我认为当以下算法应该起作用时,这可能有点矫枉过正:
- 将所有子网转换为两个整数:一个为 ip 值
IP
,另一个为子网长度 Subnet
- 对于每一对,将其与您的根对列表进行比较
for s in subnets:
markForRoots = False
for r in roots:
if ((s.IP ^ r.IP) >> s.Subnet) == 0: #if they share the same prefix
if s.Subnet > r.Subnet: #if the current subnet is bigger
# remove r from root
markForRoots = True
if markForRoots:
# add s to roots
我有一个文本文件,其中存储了我们内部使用的大量网络列表 (250k+),格式如下:
10.4.5.0/30
10.4.5.0/24
10.4.7.0/24
10.4.0.0/16
10.3.5.0/24
10.3.0.0/16
172.15.51.0/24
172.0.0.0/8
我想尝试减少列表以使处理更有效率。使用 Python,如何有效地将列表压缩到包含所有 IP 的最大子网中?是否有任何库可以使这更容易?
例如,上面的列表可以简化为:
10.4.0.0/16
10.3.0.0/16
172.0.0.0/8
作为扩展,这在 IPv6 中是否可行?
你可能想试试这个github-IPy
使用 IPSet
合并您的 IP。它适用于 ipv6。但是我不太确定性能。也许 golang 更适合这样的工作。
稍作修改的路由 trie 肯定可以,但我认为当以下算法应该起作用时,这可能有点矫枉过正:
- 将所有子网转换为两个整数:一个为 ip 值
IP
,另一个为子网长度Subnet
- 对于每一对,将其与您的根对列表进行比较
for s in subnets:
markForRoots = False
for r in roots:
if ((s.IP ^ r.IP) >> s.Subnet) == 0: #if they share the same prefix
if s.Subnet > r.Subnet: #if the current subnet is bigger
# remove r from root
markForRoots = True
if markForRoots:
# add s to roots