lionsoul2014/ip2region
 Watch   
 Star   
 Fork   
16 hours ago
ip2region

v3.6.0

  1. ip2region.js npm 包支持:
npm install ip2region.js --save
  1. javascript binding (nodejs / typescript) 提供了对 IPv6 的查询支持,具体使用文档请参考 javascript Binding,测试方式如下:
➜  javascript git:(master) node tests/search.app.js --db=../../data/ip2region_v6.xdb                           
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, ioCount: 2, took: 158.64 μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 14, took: 256.98 μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, ioCount: 21, took: 241.755 μs}
ip2region>>
  1. 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜  javascript git:(master) node tests/bench.app.js --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt                                    
Searcher: {"version": IPv6, "dbPath": ../../data/ip2region_v6.xdb, "handle": 21, "vectorIndex": 524288 "cBuffer": null}
Bench finished, {cachePolicy: vectorIndex, total: 34159862, took: 963.9443019528878 s, cost: 28.21862400828457 μs/op}

3415.9 万个 IPv6 平均查询耗时为 28.2 微秒/次。

15 days ago
ip2region

v3.5.1-release

  1. C binding 修改通过了 msvc 的编译运行。
  2. Rust maker 提供了 IPv6 的生成支持,详细文档请参考 Rust Maker,使用方式如下:
# ipv6
./target/release/maker --src=../../../data/ipv6_source.txt --dst=./target/ipv6.xdb --ip-version v6
# ipv4
./target/release/maker --src=../../../data/ipv4_source.txt --dst=./target/ipv4.xdb --ip-version v4
  1. Golang / Java maker 优化 IP 段的合并逻辑,对于自定义字段生成 xdb 的情况能提供更好的压缩效果,以社区 v4-基础版 的 3.4G 的 商业数据不同版本的 xdb 大小对比如下:
版本 优化前 优化后 瘦身率
满载版 349M 266M 23.7%
标准版 325M 241M 25.8%
精简版 324M 69M 78.7%
21 days ago
ip2region

v3.5.0-release

  1. Rust binding 增加了 NoCache / VectorIndex / FullMemory 三种缓存策略的完整实现。
  2. Rust binding 提了 IPv6 的查询支持,具体使用文档请参考 Rust Binding,测试方式如下:
$ cd binding/rust
$ ./target/release/searcher --xdb='../../data/ip2region_v6.xdb' query

ip2region xdb searcher test program, type `quit` or `Ctrl + c` to exit
ip2region>> 2001:5:4::
region: Ok("荷兰|北荷兰省|阿姆斯特丹|专线用户"), took: 284.80775ms
ip2region>> 2001::
region: Ok("美国|加利福尼亚州|洛杉矶|专线用户"), took: 12.75µs
ip2region>> 2001:5:6::
region: Ok("荷兰|北荷兰省|阿姆斯特丹|专线用户"), took: 52.958µs
ip2region>> 2001:5:5::
region: Ok("比利时|弗拉芒大区|泽勒|专线用户"), took: 123.375µs
ip2region>>
  1. Rust 增加了标准的原始数据/xdb 的 bench 测试,方便开发者测试查询性能,验证 xdb 文件的有效性,测试方式如下:
$ cd binding/rust/example
$ cargo build -r
## 通过 data/ip2region_v4.xdb 和 data/ipv4_source.txt 进行 ipv4 的 bench 测试:
$ RUST_LOG=debug ../target/release/searcher --xdb='../../../data/ip2region_v4.xdb' bench '../../../data/ipv4_source.txt'
## 通过 data/ip2region_v6.xdb 和 data/ipv6_source.txt 进行 ipv6 的 bench 测试:
$ RUST_LOG=debug ../target/release/searcher --xdb='../../../data/ip2region_v6.xdb' bench '../../../data/ipv6_source.txt'
  1. Java/Golang maker 生成过程中的允许空 region 信息方便自定义字段的的指定,有些字段的值确实为空。
24 days ago
ip2region

v3.4.0-release

  1. lua_c binding 提供了对 IPv6 的查询支持,具体使用文档请参考 Lua_c Binding,测试方式如下:
➜  lua_c git:(master) lua ./search_test.lua --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, io_count: 2, took: 63μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, io_count: 14, took: 55μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, io_count: 21, took: 127μs}
ip2region>>
  1. 因为接入的最新的 c binding 并且使用的自动 region 内存管理,所以适用于任意长度的地域信息的查询。
  2. 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜  lua_c git:(master) ✗ lua ./bench_test.lua --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt                       
Bench finished, {cachePolicy: vectorIndex, total: 34159862, took: 829.008 s, cost: 23.176 μs/op}

3415.9 万个 IPv6 平均查询耗时为 23.1 微秒/次。

26 days ago
ip2region

v3.3.0-release

  1. C binding 提供了对 IPv6 的查询支持,具体使用文档请参考 C Binding,测试方式如下:
➜  c git:(master) ./xdb_searcher search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, io_count: 2, took: 42 μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, io_count: 21, took: 121 μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
  1. 使用 xdb_region_buffer_t 来管理 region 信息的存储,即支持旧的基于固定栈内存的存储方式,可以减少运行时的内存碎片,也支持新的按需自动内存分配来适应各种地域信息,使用方式如下:
#include "xdb_api.h"

// 1, 通过指定一块内存来创建 region_buffer
char buffer[512];
xdb_region_buffer_t region;
int err = xdb_region_buffer_init(&region, buffer, sizeof(buffer));
if (err != 0) {
    // 初始化失败
    printf("failed to init region buffer width errcode=%d", err);
    return;
}

// 2,通过指定 NULL 来创建 region_buffer,让其自动按需分配内存
xdb_region_buffer_t region;
int err = xdb_region_buffer_init(&region, NULL, 0);
if (err != 0) {
    // 初始化失败
    printf("failed to init region buffer width errcode=%d", err);
    return;
}

// 备注:在每次调用 search 完成 IP 定位信息的查询后,你需要手动调用函数来释放内存 .
// search 函数使用未经清理的 region 信息会报错。
xdb_region_buffer_free(&region);
  1. 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜  c git:(fr_c_ipv6) ✗ ./xdb_searcher bench --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cache_policy: vectorIndex, total: 34159862, took: 857.750s, cost: 24 μs/op}

341.59 万个 IPv6 平均查询耗时为 24 微秒/次。

2025-09-15 21:01:41
ip2region

v3.2.0-release

  1. PHP binding 提供了对 IPv6 的查询支持,具体使用文档请参考 PHP Binding,测试方式如下:
➜  php git:(master) php search_test.php --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb file: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> ::
{region: |||, ioCount: 2, took: 0.03223 ms}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 美国|加利福尼亚州|洛杉矶|专线用户, ioCount: 21, took: 0.06592 ms}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 14, took: 0.05078 ms}
  1. php binding 实现引入了命名空间 \ip2region\xdb 来进行管理,将具体的实现封装到了四个核心类,具体如下:
类名 描述
Util 全部的工具类函数都封装在这个类中,例如:parseIP / loadHeader / loadVectorIndex 等等。
IPv4 / IPv6 IP版本管理类,拆异化的 IPv4/IPv6 管理。
Searcher xdb 查询的具体实现封装,主要提供了 search(string) 和 searchByBytes(bytes) 两个查询接口。
  1. PHP 使用引入方式如下:
// 引入 xdb 类包,require 或者 autoload 对应的 class.
require 'xdb/Searcher.class.php'; 

// use 申明
use \ip2region\xdb\Util;
use \ip2region\xdb\{IPv4, IPv6};
use \ip2region\xdb\Searcher;

// 类的使用请参考 php binding 的 ReadMe
  1. 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜  php git:(master) php bench_test.php --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cachePolicy: vectorIndex, total: 34159862, took: 1587s, cost: 0.046 ms/op}

341.6万个 IPv6 平均查询耗时为 46 微秒/次。

2025-09-13 10:28:28
ip2region

v3.1.0-release

  1. Java maker 添加连续 IP 段的自动检测和合并,实现和 golang maker 一样的自动压缩效果。
  2. Java maker 添加 IPv6 xdb 生成的支持,使用方式如下:
// IPv4
java -jar target/ip2region-maker-3.0.0.jar --src=../../data/ipv4_source.txt --dst=./ip2region_v4.xdb --version=ipv4
// IPv6
java -jar target/ip2region-maker-3.0.0.jar --src=../../data/ipv6_source.txt --dst=./ip2region_v6.xdb --version=ipv6
  1. Java binding 提供了对 IPv6 查询的支持,具体使用文档请参考:Java binding,测试方法如下:
➜  java git:(fr_java_ipv6) ✗ java -jar target/ip2region-3.1.0.jar search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> 240e:3b7:3272:d8d0:db09:c067:8d59:539e     
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 14, took: 424 μs}

IPv6 支持版本的 Maven 坐标如下:

<dependency>
    <groupId>org.lionsoul</groupId>
    <artifactId>ip2region</artifactId>
    <version>3.1.0</version>
</dependency>
2025-09-08 11:40:24
ip2region

v3.0.0-release

  1. XDB 存储引擎提供了对 IPv6 的支持,同时仓库的 data/ 下提供一份 1.8G+ 的精确到城市级别的 ipv6_source.txt 和一份生成好的 ip2region_v6.xdb 文件。
  2. Golang maker 提供了对 IPv6 xdb 的生成支持,使用方式如下:
# ipv4 
./xdb_maker gen --src=../../data/ipv4_source.txt --dst=./ip2region_v4.xdb --version=ipv4
# ipv6
./xdb_maker gen --src=../../data/ipv6_source.txt --dst=./ip2region_v6.xdb --version=ipv6
  1. Golang binding 提供了对 IPv6 查询的支持,具体使用文档请参考 Golang binding,测试方式如下:
➜  golang git:(master) ✗ ./xdb_searcher search --db=../../data/ip2region_v6.xdb
ip2region xdb searcher test program
source xdb: ../../data/ip2region_v6.xdb (IPv6, vectorIndex)
type 'quit' to exit
ip2region>> 240e:87c:892:ffff:ffff:ffff:ffff:ffff
{region: 中国|广东省|深圳市|专线用户, ioCount: 12, took: 130.294µs}
ip2region>>
  1. IPv4 数据定位信息格式调整为 " 国家 | 省份 | 城市 | ISP",去掉了之前为 0 的区域字段,便于和 IPv6 的数据格式保持一致,使用开源版本的 IPv4 数据的小伙伴记得调整获取字段的小标。