ruby - 给定一个 CIDR 块列表,如何有效地找到一个 IP 地址在 Ruby 中属于哪个块?
问题描述
我有一个 200k+ IP 地址的列表(例如 198.161.1.1)和另一个 4k+ CIDR 块的列表(例如 198.161.0.0/16)。
如果存在,我需要尝试将输入列表中的每个 IP 与其关联的 CIDR 块匹配。
我知道 Ruby 的IPAddr
类可以很容易地确定给定的 IP 是否在这样的块中:
require 'ipaddr'
ip = IPAddr.new('198.161.1.1')
block = IPAddr.new('198.161.0.0/16')
block.include?(ip)
但是,对 200k+ IP 的 CIDR 块列表进行线性搜索需要很长时间。
我的第一个想法是对数据进行排序并尝试在 CIDR 阻止列表上进行二进制搜索。但是,我似乎无法找到一种方法来让它与 Ruby 中的任何标准库一起工作。我发现了一个名为Segment Tree的 gem ,起初它似乎非常适合这项任务,但我发现它返回nil
的结果不准确(会返回 IP,因为我知道事实有一个匹配的 CIDR 块)。
解决方案
推荐阅读
- react-native - 为什么多个 WebView 不能共享缓存?
- heremaps - 还有其他方法可以在这里调用map api吗?
- python - 在 pandas dataFrame 上按两列按 group by 创建比例
- java - java程序只有一个公共类,主方法应该只是该公共类的一部分,然后是该程序的任何其他类吗?
- laravel - Laravel 应用程序响应 429 http-status-code
- spring-integration - 如何使用转换制作集成流?
- java - 与此数组方法相比,为多个视图关联 OnClickListener() 的更好实现是什么?
- python - Plotly Dash:TypeError:字符串索引必须是整数
- javascript - Stripe:在接受付款之前进行检查
- c# - 动态 FirstOrDefault 谓词表达式