You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找到包含指定IP地址列表的最长IP前缀?

找到覆盖所有IP地址的最长公共前缀

核心思路

要找到能包含所有给定IP的最长前缀,本质是找出所有IP二进制表示的最长公共前缀,再将其转换为CIDR网络格式——这和ipaddress模块中hosts()方法(从网络导出所有IP)的逻辑完全相反。

实现代码(IPv4)

利用Python内置的ipaddress模块,无需额外依赖即可实现:

import ipaddress

def longest_common_prefix(ip_list):
    # 将所有IP转换为32位二进制字符串
    bin_ips = []
    for ip_str in ip_list:
        ip_int = int(ipaddress.IPv4Address(ip_str))
        bin_ips.append(bin(ip_int)[2:].zfill(32))
    
    # 计算最长公共前缀长度
    prefix_length = 0
    for bit_pos in range(32):
        current_bits = [ip[bit_pos] for ip in bin_ips]
        if all(bit == current_bits[0] for bit in current_bits):
            prefix_length += 1
        else:
            break
    
    # 生成对应的CIDR网络
    if prefix_length == 0:
        return ipaddress.IPv4Network("0.0.0.0/0", strict=False)
    
    prefix_bin = bin_ips[0][:prefix_length].ljust(32, "0")
    prefix_ip = ipaddress.IPv4Address(int(prefix_bin, 2))
    return ipaddress.IPv4Network(f"{prefix_ip}/{prefix_length}", strict=False)

# 示例测试
sample_ips = ["192.168.3.12", "192.168.3.45", "192.168.3.99"]
print(longest_common_prefix(sample_ips))  # 输出: 192.168.3.0/24

扩展到IPv6

只需将代码中的IPv4Address替换为IPv6Address,IPv4Network替换为IPv6Network,并将二进制长度从32改为128即可。

说明

  • ipaddress和netaddr确实没有直接提供该功能,但基于IP的二进制表示逻辑,很容易通过基础方法实现。
  • 最终返回的IPv4Network对象可以直接用于ipaddress模块的其他操作,比如验证IP是否在网络内。

内容的提问来源于stack exchange,提问作者Vasilis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:27:58