关于取 ip 补集问题

2014-12-07 03:22:20 +08:00
 ovear
=。=上一贴脑残了。。其实我想问的是取补集问题

上贴联动
http://v2ex.com/t/152080

现在有一部分ip,格式是
1.2.3.4/22
9.10.11.12/23
现在想取他的补集,不知道有什么快捷的方法么 0 0

另外感谢 @orzfly 提供的工具,很有用!
3470 次点击
所在节点    问与答
28 条回复
ovear
2014-12-07 03:28:10 +08:00
果然睡得晚会导致智商下降OAQ
ryd994
2014-12-07 09:11:35 +08:00
也是联动上贴,既然交集一定是子集,那补集无非就是往上和往下数而已
LazyZhu
2014-12-07 09:32:27 +08:00
要补集总得有全集吧,请问是哪个:)
0.0.0.0/0
1.0.0.0/7
1.2.0.0/15
1.2.3.0/22
LazyZhu
2014-12-07 09:39:51 +08:00
最小补集的话其实可以从BGP网站查询的,譬如:
http://bgp.he.net/ip/1.2.3.4
http://bgp.he.net/ip/9.10.11.12
Showfom
2014-12-07 10:51:45 +08:00
第一次听到这个词语。。。。。
楼主这叫CIDR 路由器里自己设置的
ovear
2014-12-07 13:23:00 +08:00
@LazyZhu 全集是0.0.0.0/0也就是所有ip库
算是挖掉一块一块的ip 然后输出新的ip块
oaq
bgphe比较麻烦,因为是通过ip查所属段的问题。。我的是已经知道ip段落
请菊巨指教

@ryd994 交集其实应该是空的说。。

@Showfom 有区别吧,我这个需求比较奇葩
LazyZhu
2014-12-07 13:55:56 +08:00
@ovear
也可以查的
http://bgp.he.net/net/173.194.72.0/24
还有whois也可查bgp
ovear
2014-12-07 14:10:33 +08:00
@LazyZhu =.=貌似这不是补集也。。
其实我就是想要一个算法=。=
怎么在一整段ip里面分割
比如说在所有ip里面
排除 173.194.0.0/16
64.233.165.0/24
这两段
我的想法是 首先从开头来找 0.0.0.0 然后找到 173.194.0.0这个首ip,然后想办法用子网掩码近似表示(这个过程不知道是否可行,网基一团糟)
LazyZhu
2014-12-07 14:23:36 +08:00
LazyZhu
2014-12-07 14:36:21 +08:00
@ovear
对了, 你是要单独一个,还是几个的补集?
ryd994
2014-12-07 15:05:53 +08:00
@ovear 交集不一定为空
192.168.0.0/18
192.168.1.0/24
所以我说一定是子集还一定是其中之一
ovear
2014-12-07 15:14:44 +08:00
@LazyZhu 多个的补集拉

@ryd994 我的ip其实是从bgphe上拉下来的拉 所以不会有交集
ryd994
2014-12-07 15:31:16 +08:00
@ovear ipv4 32位,直接一个500M的boolean数组扔过去……
如果知道最大prefix长度还可以减少
ryd994
2014-12-07 15:37:45 +08:00
其实这就是个二分……
Showfom
2014-12-07 15:56:20 +08:00
你自己是找不出来的,因为机房怎么设置的你不知道。。。
LazyZhu
2014-12-07 15:57:19 +08:00
@ovear 还没搞定?
等我烧完菜,帮你写个awk脚本吧
其实用C写性能更好,可惜不会:(
LazyZhu
2014-12-07 16:18:49 +08:00
# cat /tmp/test.list
1.2.3.0/22
9.10.11.0/23
101.120.0.0/14

# cidr_complement.sh
0.0.0.0/8
1.0.0.0/15
1.2.0.0/23
1.2.2.0/24
1.2.7.0/24
1.2.8.0/21
1.2.16.0/20
1.2.32.0/19
1.2.64.0/18
1.2.128.0/17
1.3.0.0/16
1.4.0.0/14
1.8.0.0/13
1.16.0.0/12
1.32.0.0/11
1.64.0.0/10
1.128.0.0/9
2.0.0.0/7
4.0.0.0/6
8.0.0.0/8
9.0.0.0/13
9.8.0.0/15
9.10.0.0/21
9.10.8.0/23
9.10.10.0/24
9.10.13.0/24
9.10.14.0/23
9.10.16.0/20
9.10.32.0/19
9.10.64.0/18
9.10.128.0/17
9.11.0.0/16
9.12.0.0/14
9.16.0.0/12
9.32.0.0/11
9.64.0.0/10
9.128.0.0/9
10.0.0.0/7
12.0.0.0/6
16.0.0.0/4
32.0.0.0/3
64.0.0.0/3
96.0.0.0/6
100.0.0.0/8
101.0.0.0/10
101.64.0.0/11
101.96.0.0/12
101.112.0.0/13
101.124.0.0/14
101.128.0.0/9
102.0.0.0/7
104.0.0.0/5
112.0.0.0/4
128.0.0.0/0

需要其他编程语言的话,参照这个改一下就ok了

代码:
https://gist.github.com/LazyZhu/3f15cf7ab3777b54d21c
ovear
2014-12-07 18:54:23 +08:00
@LazyZhu 感谢OAQ,简直男神。。
ericFork
2014-12-07 19:24:27 +08:00
难道需求是取 逆·chnroutes?
ovear
2014-12-07 19:30:00 +08:00
@ericFork 类似吧。。跟我一个小项目有关-0-

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/152081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX