查找是否在一组IP地址和IP网络中使用IP

时间:2020-08-24 11:56:41

标签: python ip

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

简单的简短示例:

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

实际大小是几千个项目。

问题是–检查IP地址和IP网络的所有这些混合形式中是否包含特定IP地址'xxx.yyy.zzz.lll'的最快方法是什么?

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

也可能有相同的设置,但内部的ips和网络用IPv4Address包中的IPv4Networkipaddress对象包装。

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

谢谢...

2 个答案:

答案 0 :(得分:1)

一种方法是使用ipaddress模块来构建set个实例的IPv4Address

>>> 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的功能,依次为您提供每个主机。

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

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

答案 1 :(得分:-1)

我建议使用列表并执行以下操作:

if "xxx.yyy.zzz.ttt" in ip_list:
    print("IP IN LIST")

致谢。

相关问题