一、 問題描述:
需要判斷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
方法錯誤
方法二、轉變整數(shù)進行比較:
int(start_ip.replace('.', '')) <= int(target_ip.replace('.', '') <= int (end_ip.replace('.', '')
這個方法也有問題:
start_ip–>: 191110
end_ip–>:19111255
那么滿足條件的IP數(shù)量遠遠不止256,必然是錯誤的;
start_ip是6位數(shù),end_ip是8位數(shù),那么任意7位數(shù)的都可以滿足條件,那必然是錯誤的結果
方法錯誤
方法三、轉換成IPv4Network中的對象
IPv4Network(end_ip) >= IPv4Network(target_ip) >= IPv4Network(start_ip)
方法正確
方法四、轉換成整數(shù)列表
def ip2int(ip):
return list(map(int, ip.split('.'))
ip2int(start_ip) <= ip2int(target_ip) <= ip2int(end_ip)
方法正確
方法五、轉換成相同整數(shù)(二)
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)
方法正確文章來源:http://www.zghlxwxcb.cn/news/detail-476247.html
三、方案優(yōu)劣:
速度優(yōu)劣:
方法三:
%%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比較的本質是就是要轉換成相同位數(shù)的整數(shù)類型進行比較;
會不會存在更簡潔方法呢?文章來源地址http://www.zghlxwxcb.cn/news/detail-476247.html
到了這里,關于ip大小比較的方法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!