Python 如何高效地查询网络(范围)?

Python 如何高效地查询网络(范围)?,python,networking,Python,Networking,我有一组大约5000个网络范围,其中有相应的名称(例如,192.168.0.0/24->“网络Z”)许多网络重叠,掩码方面=具有较小掩码的网络可能包括具有较大掩码的网络 在上面的示例中,IP 1应该与NW D匹配(因为它是最具体的,即最小的,具有最大的掩码),即使它也会匹配NW B和NW A 我使用netaddr实现了这个搜索,并拥有一个网络排序列表(按.size属性升序),我反复搜索第一个匹配项。此解决方案有效,但速度较慢 有更好的解决办法吗 编辑:根据答案,解决方案是将范围作为dict的键

我有一组大约5000个网络范围,其中有相应的名称(例如,
192.168.0.0/24
->
“网络Z”
)许多网络重叠,掩码方面=具有较小掩码的网络可能包括具有较大掩码的网络

在上面的示例中,
IP 1
应该与
NW D
匹配(因为它是最具体的,即最小的,具有最大的掩码),即使它也会匹配
NW B
NW A

我使用
netaddr
实现了这个搜索,并拥有一个网络排序列表(按
.size
属性升序),我反复搜索第一个匹配项。此解决方案有效,但速度较慢

有更好的解决办法吗


编辑:根据答案,解决方案是将范围作为dict的键,按相反顺序迭代,并检查dict中是否存在键。这将提供包含IP的最小网络。

使用掩码。要获取子网,请使用掩码和地址。如果使用多个地址并使用最小的掩码,则相等的结果都将是较大子网的一部分

例如:

  • 10.11.12.13/32
  • 10.11.12.12/31
  • 10.11.12.12/30
  • 10.11.12.8/29
  • 10.11.12.0/28
  • 10.11.12.0/27
  • 10.11.12.0/26
  • 10.11.12.0/25
  • 10.11.12.0/24

用最小的掩码(
255.255.255.0
)屏蔽每个地址,您将看到它们都在
10.11.12.0/24

范围内。这是一个很好的主意,谢谢!我将根据
netaddr