为了账号安全,请及时绑定邮箱和手机立即绑定

如何检测两个 Golang net.IPNet 对象是否相交?

如何检测两个 Golang net.IPNet 对象是否相交?

Go
波斯汪 2021-12-07 10:06:06
如何检测两个Golang net.IPNet对象之间是否有交集?也就是说,如何检查双方是否第一网络子网中的第二个的OR如果第二网络是第一个子网。Go 是否为这个特定任务提供了任何实用功能?请参阅下面的测试代码。package mainimport (    "fmt"    "net")func main() {    _, net1, _ := net.ParseCIDR("1.1.1.1/24")    _, net2, _ := net.ParseCIDR("1.1.0.2/16")    _, net3, _ := net.ParseCIDR("1.1.1.3/25")    _, net4, _ := net.ParseCIDR("1.2.0.4/16")    test(net1, net2, true)    test(net2, net1, true)    test(net1, net3, true)    test(net3, net1, true)    test(net1, net4, false)    test(net4, net1, false)}func test(n1, n2 *net.IPNet, expect bool) {    result := intersect(n1, n2)    var label string    if result == expect {        label = "good"    } else {        label = "FAIL"    }    fmt.Printf("test intersect(%v,%v)=%v expected=%v => %s\n", n1, n2, result, expect, label)}func intersect(n1, n2 *net.IPNet) bool {    return false // FIXME WRITEME}
查看完整描述

2 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

如果(正如您的测试用例似乎暗示的那样)您不关心哪一边包含哪一边,而只是有重叠,这应该就足够了。


func intersect(n1, n2 *net.IPNet) bool {

    return n2.Contains(n1.IP) || n1.Contains(n2.IP)

}


查看完整回答
反对 回复 2021-12-07
?
森栏

TA贡献1810条经验 获得超5个赞

您可以利用这样一个事实,即 IP 地址 ( net.IP) 和网络掩码 ( net.IPMask) 只是[]byte包含二进制 IP 地址的字节片 ( )。您可以在网络地址及其掩码上使用常用的按位运算符来确定一个网络是否是另一个网络的子网:


func intersect(n1, n2 *net.IPNet) bool {

    for i := range n1.IP {

        if n1.IP[i] & n1.Mask[i] != n2.IP[i] & n2.Mask[i] & n1.Mask[i] {

            return false

        }

    }

    return true

}

此函数缺少一些基本的健全性检查(例如,当传递一个 IPv4 和一个 IPv6 地址时它会中断),但该示例应该足以了解其要点。


除了第一个之外,它在您问题的所有测试用例中都成功。但毕竟,1.1.0.2/16并不是真正的子网1.1.1.1/24(反之亦然)。


https://play.golang.org/p/Kur5n2hfLg


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信