有没有什么简单、性能也还过得去的 匹配 CIDR 集合(包含 IPv6 的 CIDR)的算法推荐?

2020-05-27 22:54:51 +08:00
 monsoon

需求很简单的,就是有一个 1W 个左右的 CIDR 集合(包括 IP 、CIDR ),想匹配一个 IP 在不在这里面。宿主语言是 Java 之类不直接操作指针的语言。输入结果是一个 true 或者 false 就可以了。 现在我只会 loop 的方法和 binary trie…… IPv6 和 IPv4 我会分成两个集合分开来匹配就可以了。

找了一下论文,感觉有很多的 Longest prefix match 的算法,但是不知道哪个改起来合适……写起来简单,性能也还可以,内存占用也不太。

大家有没有什么推荐的算法,不要那种要 128 次匹配(对于 IPv6 )的那种。先谢谢了。

1446 次点击
所在节点    算法
3 条回复
rrfeng
2020-05-27 23:30:13 +08:00
cidr ?要想快直接变数值,然后算出边界来直接比大小啊……简单写个二分查找就不会很差吧
iRiven
2020-05-28 09:46:22 +08:00
统统转成 u128,然后排序 二分查找,最快
monsoon
2020-05-28 20:40:29 +08:00
非常感谢楼上两位,转换成了一个 pair (表示 range ) 的 list,二分法非常好写。

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

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

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

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

© 2021 V2EX