2つのことをしたいと思います。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に該当するかどうかを確認します。これは、私のWebアプリで非常に一般的なルックアップであるため、非常に高速なクエリである必要があります。私はこのようなことをすることを考えています:
def matches?(request)
valid = @ips.select {|cidr| cidr.contains?(request.remote_ip) }
!valid.empty?
end
IP範囲をCIDRに変換すると、IPを整数オクテットに分割する現在行っている処理よりも高速にルックアップできるようになると思います。次に、最初の2セットのオクテットにインデックスを付けて、IPと部分的に一致させます。別のオプションは、すべてをintに変換し、その方法で比較を行うことです。このようなものでintに変換しますIPAddr.new("1.1.1.1").to_i
が、単一のCIDRではなく、範囲ごとに上限と下限のIPを格納する必要があります。
主流のアプローチ、人気のある宝石、レポを見落としている場合はお知らせください。ありがとう!