【问题标题】:Quickly locate an IP address within 3 million rows of CIDR formatted IP ranges在 300 万行 CIDR 格式的 IP 范围内快速定位 IP 地址
【发布时间】:2020-11-10 06:20:50
【问题描述】:

我已经获得了基于IP的地理位置数据库,格式如下:

1.0.0.0/24,2077456,2077456,,0,0,,-33.4940,143.2104,1000
1.0.1.0/24,1814991,1814991,,0,0,,34.7725,113.7266,50
1.0.2.0/23,1814991,1814991,,0,0,,34.7725,113.7266,50
1.0.4.0/22,2077456,2077456,,0,0,,-33.4940,143.2104,1000
1.0.8.0/21,1814991,1814991,,0,0,,34.7725,113.7266,50
...
223.255.254.0/24,1880252,1880251,,0,0,37,1.3267,103.8869,5
223.255.255.0/24,2077456,2077456,,0,0,,-33.4940,143.2104,1000

CSV 文件中总共包含超过 300 万行。每行的第一部分是 CIDR 格式的 IP 范围。

我需要一种有效的方法来在这些行中快速定位给定的 IP 地址。比如给定IP地址1.0.1.2,我想快速定位到第二行,这样我就可以得到它的坐标,也就是这行剩下的数据。我想知道是否有任何有效的方法可以做到这一点,而不是从头开始检查每一行。

难点在于,比如IP范围1.0.2.0/23包含了IP地址1.0.3.0,所以单纯的字符串匹配是不行的。

【问题讨论】:

  • ip总是在开头吗?
  • 是的,其实是来自GeoLite2基于IP的地理定位数据库,每一行都是一样的格式。

标签: python ip-address cidr


【解决方案1】:

我自己找到了方法。首先将 8 位分段 IP 地址转换为十进制格式,从而将 CIDR 格式的 IP 范围转换为两个十进制数字。然后我使用bisect模块查找IP所属的范围。

【讨论】:

    【解决方案2】:
    def search_line(csv, ip):
        for line in csv:
            if line.startswith(ip):
                return line
    

    【讨论】:

    • 我认为startswith 不会帮助将 IP 地址与 CIDR 范围匹配。
    • 谢谢,这里需要计算一下,单纯的字符串匹配是不行的。
    • 也许我当时误解了你的问题,但你不想要出现 ip 的那一行吗?为什么字符串匹配不起作用?然后,您可以将该行拆分为一个列表,例如:line.split(",") 并获取最后一部分,例如:line.split(",")[-1]
    • 因为对于 CDIR 格式的 IP,1.0.2.0/23 将包含 1.0.3.0,所以仅仅字符串匹配是行不通的。
    猜你喜欢
    • 2012-11-07
    • 2023-04-05
    • 1970-01-01
    • 2016-05-22
    • 2013-08-22
    • 1970-01-01
    • 2012-03-26
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多