• ip大小比较的方法


    一、 问题描述:

    需要判断IP值是否在某个范围内,比如说某某IP是否在192.169.1.0/24?
    

    二、 方案描述:

    1、首先要获取IP范围;
    from ipaddress import IPv4Network
    start_ip = IPv4Network('19.11.1.0/24')[0]
    end_ip = IPv4Network('19.11.1.0/24')[-1]
    print(f'{start_ip}->{end_ip}')
    输出:
    19.11.1.0->19.11.1.255
    
    2、比较的方法
    方法一、字符串直接比较:
    start_ip <= target_ip <= end_ip
    

    这个方法是有问题的,检出来的一定是准确的,但会漏掉很多;

    比如说:192.168.1.9 是大于 192.168.1.255

    方法错误

    方法二、转变整数进行比较:
    int(start_ip.replace('.',  '')) <= int(target_ip.replace('.', '') <= int (end_ip.replace('.', '')
    

    这个方法也有问题:
    start_ip–>: 191110
    end_ip–>:19111255
    那么满足条件的IP数量远远不止256,必然是错误的;
    start_ip是6位数,end_ip是8位数,那么任意7位数的都可以满足条件,那必然是错误的结果

    方法错误

    方法三、转换成IPv4Network中的对象
    IPv4Network(end_ip) >= IPv4Network(target_ip) >= IPv4Network(start_ip) 
    

    方法正确

    方法四、转换成整数列表
    def ip2int(ip):
    	return list(map(int, ip.split('.'))
    ip2int(start_ip) <= ip2int(target_ip) <= ip2int(end_ip)
    

    方法正确

    方法五、转换成相同整数(二)
    def ip2int(ip):
        a, b, c, d = map(int, ip.split('.'))
        return ((a * 255 + b) * 255  + c) * 255 + d 
        
    ip2int(start_ip) <= ip2int(target_ip) <= ip2int(end_ip)
    

    方法正确

    三、方案优劣:

    速度优劣:

    方法三:
    %%timeit
    def ip2int(ip):
        return list(map(int, ip.split('.')))
    for i in range(1000):
        ip2int('19.2.2.9') > ip2int('19.2.2.255')
    
    输出:
    28.8 ms ± 1.68 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    方法四、
    %%timeit
    def ip2int(ip):
        return list(map(int, ip.split('.')))
    for i in range(1000):
        ip2int('19.2.2.9') > ip2int('19.2.2.255')
    
    输出:
    3.8 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    方法五、
    %%timeit
    def ip2int(ip):
        a, b, c, d = map(int, ip.split('.'))
        return ((a * 255 + b) * 255  + c) * 255 + d 
    for i in range(1000):
        ip2int('19.2.2.9') > ip2int('19.2.2.255')
    
    输出:
    4.02 ms ± 168 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    四、结论:

    1、综上所述:选择方法四;
    
    2、IP比较的本质是就是要转换成相同位数的整数类型进行比较;
    

    会不会存在更简洁方法呢?

  • 相关阅读:
    使用ELK8.4.1环境+Filebeat收集nginx日志
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java手工艺品在线网站k5284
    STM32不使用 cubeMX实现外部中断
    无人机开发
    ubuntu20.04 vins-fusion 运行记录
    数据结构-时间复杂度/空间复杂度
    Midjourney提示词-十二生肖唐装系列-2
    8、Mybatis-Plus 分页插件、自定义分页
    【c++提高1】数据结构之线段树详解
    java面试需要掌握知识点
  • 原文地址:https://blog.csdn.net/ningyanggege/article/details/127113023