首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找IP地址和ip网络集合中的ip

查找IP地址和ip网络集合中的ip
EN

Stack Overflow用户
提问于 2020-08-24 19:56:42
回答 2查看 51关注 0票数 1

我有一个包含ip4地址和ip4网络的集合。

简单简短的例子:

代码语言:javascript
复制
{'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网络的混合中,而不是逐个迭代它们,最快的方法是什么?

在设置普通ip的情况下,这是显而易见的,但在存在ip网络的情况下则不是这样,因为网络可能也包含此ip。

也可以有相同的set,但是其中的in和网络被包装在ipaddress包中的IPv4AddressIPv4Network对象中。

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

谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-24 20:10:09

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

代码语言:javascript
复制
>>> 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
EN

Stack Overflow用户

发布于 2020-08-24 20:02:46

我建议使用列表,并这样做:

代码语言:javascript
复制
if "xxx.yyy.zzz.ttt" in ip_list:
    print("IP IN LIST")

致以问候。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63560561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档