我有大约 12600 个子网:
例如。 123.123.208.0/20
和一个IP。
我可以使用 SQLite 数据库或数组或其他任何东西
大约一个月前有人问过一个类似的问题,但是我不是在寻找针对一个子网检查一个IP,而是针对一堆子网(显然是最有效的方法,希望不是O(总子网)):)
我如何检查 IP 是否属于这些子网之一,我需要 true 或 false 而不是子网(如果这有助于优化)。
当前列表中有类似的子网,例如:
(实际摘录)
123.123.48.0/22 <-- not a typo
123.123.48.0/24 <-- not a typo
123.123.90.0/24
123.123.91.0/24
123.123.217.0/24
总共范围从 4.x.y.z 到 222.x.y.z
在我看来,最好的方法是使用按位运算符。例如,123.123.48.0/22
代表(123<<24)+(123<<16)+(48<<8)+0
(=2071670784;这可能是负数)作为 32 位数字 IP 地址,以及-1<<(32-22)
= -1024 作为掩码。有了这个,同样,您的测试 IP 地址也转换为数字,您可以执行以下操作:
(inputIP & testMask) == testIP
例如,123.123.49.123 就在该范围内,如下所示2071671163 & -1024
是 2071670784
那么,这里有一些工具功能:
function IPnumber(IPaddress) {
var ip = IPaddress.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
if(ip) {
return (+ip[1]<<24) + (+ip[2]<<16) + (+ip[3]<<8) + (+ip[4]);
}
// else ... ?
return null;
}
function IPmask(maskSize) {
return -1<<(32-maskSize)
}
test:
(IPnumber('123.123.49.123') & IPmask('22')) == IPnumber('123.123.48.0')
yields true
.
如果您的掩码格式为“255.255.252.0”,那么您也可以对掩码使用 IPnumber 函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)