JavaScript:IP 在这些子网之一中吗?

标签 javascript sql sqlite performance subnet

所以我有 ~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/

相关文章:

sql - 在具有匹配键的 SQL 中从更新

c++ - 在 Qt 中编写 SQlite 数据库

javascript - 使用 JavaScript 动态设置选择选项

javascript - jQuery 手机 : absolute external panel on right side not working

javascript - 有人可以就我的 Axios Post 请求提供建议吗?

javascript - Web Audio API - 播放时删除过滤器

.NET 到远程 SQL Server 在一台计算机上速度较慢,在另一台计算机上则不然

sql - 使用一个 SELECT 而不是两个来服务于旁加载的 API 请求?

iphone - iOS 网络服务 xml 帮助

android - 如何用新数据正确覆盖 SQLite 表行?