【发布时间】:2012-11-04 14:08:03
【问题描述】:
我想做两件事:将 IP 地址输入转换为 CIDR 以下是一些示例输入:
1.1.1.1
192.168.*.* #=> 192.168.0-255.0-255
192.168.1.2-20
1.1.1-10.1-100
检查给定的 IP 地址是否属于任何 CIDR。这一定是一个非常快速的查询,因为它是我的网络应用程序中非常常见的查找。我正在考虑做这样的事情:
def matches?(request)
valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
!valid.empty?
end
我认为将 IP 范围转换为 CIDR 将使查找速度比我们现在所做的更快,即将 IP 分解为整数八位字节。然后,我们索引前两组八位字节以部分匹配 IP。另一种选择可能是将所有内容转换为整数并以这种方式进行比较。我会使用类似IPAddr.new("1.1.1.1").to_i 的东西转换为整数,但是我需要为每个范围存储一个上限和下限 IP,而不仅仅是一个 CIDR。
如果我忽略了任何主流方法、流行的 gem 或 repo,请告诉我。谢谢!
【问题讨论】:
标签: ruby-on-rails ruby ip ip-address cidr