首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测postgresql db中子网重叠的最佳方法

检测postgresql db中子网重叠的最佳方法
EN

Stack Overflow用户
提问于 2013-09-23 22:15:11
回答 2查看 1.8K关注 0票数 4

我有一个postgres数据库,有将近200000个网络地址类型。我想检测一些子网是否重叠,对于ex,检测123.0.0.0/16、123.2.0.0/24和123.3.4.128/30并报告它们。

我已经使用了很多python脚本和netaddr库。

考虑到条目的数量,检测重叠的最佳方法/算法是什么?

我很确定有一种比将每个条目与整个数据库进行比较更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-23 22:37:55

我认为以下是一个相当有效的方法:

代码语言:javascript
运行
复制
import netaddr
import bisect

def subnets_overlap(subnets):
    # ranges will be a sorted list of alternating start and end addresses
    ranges = []
    for subnet in subnets:
        # find indices to insert start and end addresses
        first = bisect.bisect_left(ranges, subnet.first)
        last = bisect.bisect_right(ranges, subnet.last)
        # check the overlap conditions and return if one is met
        if first != last or first % 2 == 1:
            return True
        ranges[first:first] = [subnet.first, subnet.last]
    return False

示例:

代码语言:javascript
运行
复制
>>> subnets_overlap([netaddr.IPNetwork('1.0.0.0/24'), netaddr.IPNetwork('1.0.0.252/30')])
True
>>> subnets_overlap([netaddr.IPNetwork('1.0.0.0/24'), netaddr.IPNetwork('1.0.1.0/24')])
False
票数 5
EN

Stack Overflow用户

发布于 2016-10-18 09:50:41

代码语言:javascript
运行
复制
import sys
import ipaddr
from pprint import pprint

from netaddr import IPNetwork, IPAddress
matching_subent=[]
def cidrsOverlap(cidr0):
    subnets_list = [IPNetwork('123.0.0.0/16'),
                    IPNetwork('123.2.0.0/24'), 
                    IPNetwork('123.132.0.0/20'),
                    IPNetwork('123.142.0.0/20')]
    flag = False
    for subnet in subnets_list:
        if (subnet.first <= cidr0.last and subnet.last >= cidr0.last): 
            matching_subent.append(subnet)


    print "Matching subnets for given %s are %s" %(cidr0, matching_subent)
    pprint(subnets_list) 

cidrsOverlap(IPNetwork(sys.argv[1]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18969801

复制
相关文章

相似问题

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