• 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比较的本质是就是要转换成相同位数的整数类型进行比较;
    

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

  • 相关阅读:
    Spring注解(简便地使用 Bean )
    Git(11)——Git相关问题解答以及常用命令总结
    IO流(字节流与字符流) 和 File对象 详解与使用
    3Dslicer医学图像三维坐标系(xyz,RAS,IJK)差异及处理
    基于单片机的纸牌24点游戏模拟器设计
    Android---打开相册选择图片
    uniapp使用webview将页面转换成图片支持h5、app、小程序
    About 11.13 This Week
    【Linux】进程控制,进程替换
    Java RestTemplate使用TLS1.0(关闭SSL验证)
  • 原文地址:https://blog.csdn.net/ningyanggege/article/details/127113023