所以我有 ~12600 个子网:
例如。 123.123.208.0/20
和一个IP。
我可以使用 SQLite 数据库或数组或其他任何东西
大约一个月前有人问过一个类似的问题,但是我不是要针对一个子网检查一个 IP,而是要检查一堆子网(显然是最有效的方法,希望不是 O(总子网)):)
我如何检查 IP 是否属于这些子网之一,如果这有助于优化,我需要 true 或 false 而不是子网。
当前列表中有类似的子网eg.: (实际摘录)
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
最佳答案
最好的方法是 IMO 使用按位运算符。例如,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)
}
测试:
(IPnumber('123.123.49.123') & IPmask('22')) == IPnumber('123.123.48.0')
产量 true
.
如果您的掩码格式为“255.255.252.0”,那么您也可以对掩码使用 IPnumber 函数。
关于JavaScript:IP 在这些子网之一中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/503052/