在一组 ip 地址和 ip 网络中查找 IP
Find if IP in set of ip addresses and ip networks
我有一组包含 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 和网络内部包裹在 ipaddress
包中的 IPv4Address
和 IPv4Network
对象中。
也许可以通过某种方式将所有这些组合到一个伪网络中???
谢谢...
我建议使用列表并执行此操作:
if "xxx.yyy.zzz.ttt" in ip_list:
print("IP IN LIST")
此致。
一种方法是使用 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
已经包含 IPv4Network
和 IPv4Address
个实例,所有这些仍然有效。
我有一组包含 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 和网络内部包裹在 ipaddress
包中的 IPv4Address
和 IPv4Network
对象中。
也许可以通过某种方式将所有这些组合到一个伪网络中???
谢谢...
我建议使用列表并执行此操作:
if "xxx.yyy.zzz.ttt" in ip_list:
print("IP IN LIST")
此致。
一种方法是使用 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
已经包含 IPv4Network
和 IPv4Address
个实例,所有这些仍然有效。