v3.9.0
该版本的核心功能是 C# IPv6 查询支持。
- feat: support IPv6 xdb by @ArgoZhang in https://github.com/lionsoul2014/ip2region/pull/399
- fix(NET): refactor GetData method by @ArgoZhang in https://github.com/lionsoul2014/ip2region/pull/401
Full Changelog: https://github.com/lionsoul2014/ip2region/compare/v3.8.1...v3.9.0
v3.8.1
ip2region 3.8.1 版本主要是一些 binding 的标准或者低版本支持,具体更新如下:
- c binding 支持
c99标准并且 Makefile 默认添加了-std=c99编译选项。 - lua_c binding 支持
c99标准同时完成了 lua >=5.1版本的兼容,Makefile 默认也添加了-std=c99编译选项,例如编译 Lua 5.1 版本的扩展:
# cd lua_c binding
make LuaVersion=5.1- python binding 完成了 Python >=
3.7版本的兼容,Pypi 版本号更新为3.0.2。
v3.8.0
- py_ip2region pypi 包支持:
pip3 install py-ip2region
util和searcher模块:
# 工具包模块,例如:ip 解析,版本信息,vectorIndex / buffer加载等
import ip2region.util as util
# xdb 查询实现模块
import ip2region.searcher as xdb
# 使用方式参考 python binding 的 ReadMe
- python binding 提供了对 IPv6 的查询支持,具体使用文档请参考 Python Binding,测试方式如下:
(.venv) ➜ python git:(master) python3 search_test.py --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: 1, took: 180 μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, ioCount: 8, took: 251 μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 0|0|内网IP|内网IP, ioCount: 18, took: 474 μs}
ip2region>>
- 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
(.venv) ➜ python git:(master) ✗ python3 bench_test.py --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt --cache-policy=vectorIndex
searcher -> {"version": IPv6, "db_path": "../../data/ip2region_v6.xdb", "v_index": 524288, "c_buffer": None}
Bench finished, {cachePolicy: vectorIndex, total: 1614544, took: 65.378 s, cost: 40 μs/op}
161.45 万个 IPv6 平均查询耗时为 40 微秒/次。
v3.7.1
- 支持 xdb 3.0 的 binding 查询结果返回统一:查询出错保持原有的方式,找到了就返回字符串的
region信息,如果找不到指定 IP 的定位信息则返回空字符串"";原来的比较混乱,各种语言不统一,这对于一些自定义数据或者数据不完整的情况会出现,例如 ipv6 的原始数据就是从1:1::开始的,搜索::就会返回空。 - 支持 xdb 3.0 的 binding 中的 ReadMe 测试定位信息纠正,使用最新的 IPv6 纠正错误的定位信息。
- 支持 xdb 3.0 的 binding ReadMe 增加查询 API 的原型描述。
- binding 发行版本更新: Java:
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>3.1.1</version>
</dependency>npm 版本更新为 3.1.6
v3.7.0
- feat(CSharp): 增加注入服务扩展方法 by @ArgoZhang in https://github.com/lionsoul2014/ip2region/pull/390
- lua binding 提供了对 IPv6 的查询支持,具体请参考文档 Lua binding,测试方式如下:
➜ lua 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: 1, took: 0μs}
ip2region>> 240e:3b7:3272:d8d0:3b7b:3ee0:1d39:848
{region: 中国|广东省|深圳市|家庭宽带, io_count: 8, took: 0μs}
ip2region>> 2001:3:ffff:ffff:ffff:ffff:ffff:ffff
{region: 0|0|内网IP|内网IP, io_count: 18, took: 0μs}
ip2region>> 240e:3b7:3272:fab0:f703:5fef:be:37e9
{region: 中国|广东省|深圳市|家庭宽带, io_count: 8, took: 0μs}
ip2region>>
- 查询平均耗时:Razer 笔记本 / Ubuntu (电源均衡模式) + SATA SSD / VectorIndex 缓存,bench 结果如下:
➜ lua git:(master) lua ./bench_test.lua --db=../../data/ip2region_v6.xdb --src=../../data/ipv6_source.txt
Bench finished, {cachePolicy: vectorIndex, total: 1614544, took: {total: 72.000s, search: 64.000s}, cost: 39.640 μs/op}
161.4 万个 IPv6 平均查询耗时为 39.6 微秒/次。
v3.6.1
一,IPv6 数据优化更新,具体变化如下:
- 数据错误修正:最早版本的数据存在严重的错误,例如:内网或者保留 IP 也给了定位信息,现在已经修复这些错误并且统一地域信息为:
0|0|内网IP|内网IP,和 ipv4 的保留 IP 格式保持完全一致。 - 数据段清洗:原始数据有
1700万+行的 IP 数据段,IPv6 目前还没有这么分散,使用了注册局提供的信息重新定义了 v6 的数据段,经过清洗合并后只剩下807272行,成功的将原始数据从 1.8G 降低到了 81M。 - 定位信息矫正:使用注册局的一些公开信息重新校正了部分定位信息,到目前位置定位信息的准确率会有一些提升。
- 字段格式不变:还是和最版本的一致,统一为
国家|省份|城市|带宽类型。 - XDB 文件瘦身:经过清洗合并后,xdb文件也从原来的 618M 瘦身到了目前的 35M。
二,javascript binding 优化: 当目标 IP 搜索不到的时候返回 null 防止程序运行异常,对于自定义数据的情景这种情况可能会出现:
// empty match interception.
// and this could be a case.
if (dPtr == -1) {
return null;
}npm 版本请更新为:3.1.3
"dependencies": {
"ip2region.js": "^3.1.3",
}v3.6.0
- ip2region.js npm 包支持:
npm install ip2region.js --save
- 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>>
- 查询平均耗时: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 微秒/次。
v3.5.1-release
- C binding 修改通过了 msvc 的编译运行。
- 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
- Golang / Java maker 优化 IP 段的合并逻辑,对于自定义字段生成 xdb 的情况能提供更好的压缩效果,以社区
v4-基础版的 3.4G 的 商业数据不同版本的 xdb 大小对比如下:
| 版本 | 优化前 | 优化后 | 瘦身率 |
|---|---|---|---|
| 满载版 | 349M | 266M | 23.7% |
| 标准版 | 325M | 241M | 25.8% |
| 精简版 | 324M | 69M | 78.7% |
v3.5.0-release
- Rust binding 增加了
NoCache/VectorIndex/FullMemory三种缓存策略的完整实现。 - 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>>
- 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'
- Java/Golang maker 生成过程中的允许空
region信息方便自定义字段的的指定,有些字段的值确实为空。
v3.4.0-release
- 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>>
- 因为接入的最新的 c binding 并且使用的自动
region内存管理,所以适用于任意长度的地域信息的查询。 - 查询平均耗时: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 微秒/次。