• 请不要在回答技术问题时复制粘贴 AI 生成的内容
d5
V2EX  ›  程序员

关于 ip 地址匹配 ip 地址区间的小问题

  •  
  •   d5 · Jan 13, 2020 · 3186 views
    This topic created in 2497 days ago, the information mentioned may be changed or developed.

    需求:用户输入一个 IP 地址,需要匹配出地址对应的小区间

    有上万个这种小区间: 10.238.73.1-10.238.73.30

    个人能想到的只有把 ip 地址段转换为数字(例如上文的小区间是 183388417-183388446),然后通过二分法,找到最近的区间,最后判断用户输入的 ip 地址对应的数字是否在区间内。

    请问大佬们还有没有更简单、更科学的方法?现成的 go&python 库也行。

    8 replies  •  2020-01-13 15:21:47 +08:00
    Livid
    Livid
    MOD
    PRO
    Jan 13, 2020❤️1
    1
    midasfree
    midasfree
    Jan 13, 2020❤️1
    2
    转换成 cidr 进行比较
    xkeyideal
    xkeyideal
    Jan 13, 2020❤️1
    3
    两年前写过这种需求,第一个将 ip 区间排序,无需转换成数字,go 语言有 IP 类型,排序后做区间合并,多个连续的区间合并成一个,查找 IP 是否存在的时候用二分搜索即可
    hankai17
    hankai17
    Jan 13, 2020❤️1
    4
    github.com/hankai17/ipdb 做了一个 好久没维护了
    xenme
    xenme
    Jan 13, 2020❤️1
    5
    ipv4 本身就是 32bit 的数据,直接转成二进制(也就是你的数字),然后排序比较就行了啊
    xyjincan
    xyjincan
    Jan 13, 2020❤️1
    6
    PostgreSQL 数据库, 原生支持这种数据结构,可以直接基于 IP 地址查询匹配 IP 段
    no1xsyzy
    no1xsyzy
    Jan 13, 2020❤️1
    7
    单次查还是多次查有区别。
    单次的话,问题都不大,线性搜索都没什么问题,应该不是指这个。
    多次就是 bitmap set 时间效率最高,但空间效率一般,直接占用 512 MB 并且需要一次性清零。可以用初始化标记法空间换时间。

    但想了想,话说这个是不是 B-tree 的一般涉猎范畴?
    每个节点是区间下界和上界和下方最上界和上方最下界的值。
    momo1999
    momo1999
    Jan 13, 2020❤️1
    8
    二分足够快了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2141 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:27 · PVG 16:27 · LAX 00:27 · JFK 03:27
    ♥ Do have faith in what you're doing.