簡體   English   中英

將 CIDR 格式的大量重疊網絡壓縮為 Python 中的最大公分母

[英]Condense large list of overlapping networks in CIDR format to greatest common denominator in Python

我有一個文本文件,其中存儲了大量我們內部使用的 .networks (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 的最大 su.net? 是否有任何圖書館可以使這更容易?

例如,上面的列表可以簡化為:

10.4.0.0/16
10.3.0.0/16
172.0.0.0/8

作為擴展,這在 IPv6 中可能嗎?

你可能想試試這個github-IPy Use IPSet to merge your IPs。 它適用於 ipv6。 但是我不太確定性能。 也許 golang 更適合這樣的工作。

稍微修改一下路由特里樹肯定會做到這一點,但我認為當以下算法應該起作用時,這可能有點矯枉過正:

  • 將所有 su.net 轉換為兩個整數:一個為 ip 值IP另一個為 su.net 長度Su.net
  • 對於每一對,將其與您的根對列表進行比較
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM