首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fast IPv6 CIDR到数字或可比较

Fast IPv6 CIDR到数字或可比较
EN

Stack Overflow用户
提问于 2015-11-11 15:18:20
回答 1查看 684关注 0票数 1

我使用的是geoip数据库,导入ipv4数据库相当容易,CIDR格式被转换为范围,范围被转换为整数。

但我找不到任何中央资源,在那里我可以找到如何存储和搜索IPv6。

我尝试将IPv6 CIDR转换为范围,搜索库

使用ipaddr.js转换"2001:240:1000::/36",它返回[ { parts: [ 8193, 576, 4096, 0, 0, 0, 0, 0 ] }, 36 ],真的没有办法将其转换为int

位搜索

代码语言:javascript
复制
function ip62long($ipv6){
    $ip_n = inet_pton($ipv6);
    $bits = 15;

    $ipv6long = 0;

    while($bits >= 0){
        $bin = sprintf("%08b",(ord($ip_n[$bits])));

        if($ipv6long){
            $ipv6long = $bin . $ipv6long;
        }
        else{
            $ipv6long = $bin;
        }
        $bits--;
    }
    return gmp_strval(gmp_init($ipv6long, 2), 10);
}

我正在尝试导入到mongodb中,

请指导我如何在节点js中存储和搜索ipv6。

EN

回答 1

Stack Overflow用户

发布于 2015-11-11 16:18:33

MongoDB没有非常适合IPv6地址的数据类型。整数只能达到64位,但IPv6地址是128位。

最好的解决方法可能是将它们存储为字符串。如果不删除省略的零,则IPv6地址按字母顺序排序。这意味着你可以通过给出最小值和最大值来表示一个范围。IP范围2001:240:1000::/36可以表示为:

{ from: "20010240100000000000000000000000", to: "200102401fffffffffffffffffffffff" }

要查找像2001:240:1024::125a:32fd这样的IP地址范围,您可以执行以下查询:

代码语言:javascript
复制
db.ipranges.find({
    from: { $lt:"200102401024000000000000125a32fd"}, 
    to: { $gt:"200102401024000000000000125a32fd"}
});

但是,根据您的使用情况,只存储IP范围的前64位可能就足够了。在IPv6地址中,前64位是网络前缀,后64位是接口标识符。接口标识符可以是主机的MAC地址,也可以是完全随机的(带有隐私扩展)。接口标识符和地理位置之间没有关系。这意味着你不会遇到任何超过64位的GeoIP范围。因此,将IPv6范围的前64位存储为整数可能就足够了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33645850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档