查找IP是否在IP地址和IP网络集中

阿列克谢·哈特克维奇(Aleksei Khatkevich)

我有一套包含ip4地址和ip4网络的混合物。

简单的简短示例:

{'127.0.0.1', '138.56.76.02', '192.4.2.0/24', '29.24.48.80', etc, etc, etc}

实际大小是几千个项目。

问题是–检查特定的IP地址'xxx.yyy.zzz.lll'是否包含在所有这些IP地址和IP网络的混合中而又不一一遍历的最快方法是什么

设置了简单的ips是很明显的,但是ip网络的存在却不是这样,因为网络也可能包含此ip。

也可以具有相同的集合,但是内部包裹着ips和网络,IPv4Address软件包则包含IPv4Network对象ipaddress

也许有可能以某种方式将所有这些组合到一个伪网络中???

谢谢...

漫步瑙塔

一种方法是使用ipaddress模块构建setIPv4Address实例:

>>> from ipaddress import *
>>> from itertools import *
>>>
>>> p = {'127.0.0.1', '138.56.76.02', '192.4.2.0/24', '29.24.48.80', ...}
>>>
>>> all_hosts = set(chain.from_iterable(IPv4Network(n) for n in p))
>>>
>>> IPv4Address('192.4.2.4') in all_hosts
True
>>> IPv4Address('29.24.48.80') in all_hosts
True
>>> IPv4Address('29.24.48.81') in all_hosts
False

这利用了以下事实:仅从一个地址(没有掩码)构造一个IPv4Network会创建一个仅包含该地址的网络。它还使用迭代功能,IPv4Network依次为您提供每个主机。

all_hosts如果p很大或网络掩码包含许多主机,则集的构建速度会很慢,并且内存很大。但是,此后,检查IP地址是否在集合中很快(平均为O(1))。

如果p已经包含IPv4NetworkIPv4Address实例,那么所有这些仍然有效

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章