首页 > 解决方案 > 给定一个 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 块)。

标签: rubyip-address

解决方案


推荐阅读