Ip2region - 准确率99.9%的离线IP地址定位库
对于从事Web开发相关的程序员来说,给出一个 IP 地址,反查其所在的地理位置,包括国家、城市,甚至于街道等,这是一个再常见不过的需求了。
对于少量的几个IP地址,我们可以直接从搜索引擎,或者一些专门的查询网站查询得到。但对于大批量的查询,这些数据往往就需要付费了。有没有一个开源免费,又能够准确查询IP地址对应的地理位置的库呢?Ip2region就是一个不错的选择。
简介
Ip2region,是 lionsoul 在Gitee上开源的离线IP地址定位库,仓库位于
https://gitee.com/lionsoul/ip2region。
Ip2region 聚合了一些开放的IP到地名查询提供商的数据,并提供了标准化的数据格式,和各种不同编程语言的的查询实现,提供了极为便捷的开源IP地理位置查询库。
使用
Ip2region 号称提供 99.9% 的准确率,其数据聚合自以下服务商的开放API或者数据(升级程序每秒请求次数2到4次):
>80%, 淘宝IP地址库, http://ip.taobao.com/
≈10%, GeoIP, https://geoip.com/
≈2%, 纯真IP库, http://www.cz88.net/
Ip2region是用来标准化的数据格式,来存储ip地理位置信息:
_城市Id|国家|区域|省份|城市|ISP_
目前中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家。
Ip2region体积小,包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。
Ip2region查询速度快,全部的查询客户端单次查询都在0.x毫秒级别,内置了三种查询算法:
memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。
binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。
b-tree算法:基于btree算法,基于ip2region.db文件,不需要载入内存,单词查询在0.x毫秒级别,比binary算法更快。
其中,任何客户端的b-tree都比binary算法快,而memory算法总是最快的。
Ip2region提供了多查询客户端的支持,已经集成的客户端有:java、C#、php、c、python、nodejs、php 扩展 (php5和php7)、golang、rust、lua、lua_c, nginx 等等:
binding | 描述 | 开发状态 | binary查询耗时 | b-tree查询耗时 | memory查询耗时 |
c | ANSC c binding | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
c# | c# binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
golang | golang binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
java | java binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
lua | lua实现的binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒 |
lua_c | lua的c扩展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
nginx | nginx的c扩展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
nodejs | nodejs | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.1x毫秒 |
php | php实现的binding | 已完成 | 0.x毫秒 | 0.1x毫秒 | 0.1x毫秒 |
php5_ext | php5的c扩展 | 已完成 | 0.0x毫秒 | 0.0x毫秒 | 0.00x毫秒 |
php7_ext | php7的c扩展 | 已完成 | 0.0毫秒 | 0.0x毫秒 | 0.00x毫秒 |
python | python bindng | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒 |
rust | rust binding | 已完成 | 0.x毫秒 | 0.x毫秒 | 0.x毫秒 |
对于每种支持的客户端,可以通过阅读其中的README说明来使用,如C语言,可以运行demo:
cd binding/c/ gcc -g -O2 testSearcher.c ip2region.c ./a.out ../../data/ip2region.db
会看到如下cli界面:
initializing B-tree ... +----------------------------------+ | ip2region test script | | Author: chenxin619315@gmail.com | | Type 'quit' to exit program | +----------------------------------+ p2region>> 101.105.35.57 2163|中国|华南|广东省|深圳市|鹏博士 in 0.02295 millseconds
Ip2region也提供了可直接安装的库,例如:
maven仓库地址
org.lionsoulip2region1.7.2
nodejs
npm install node-ip2region --save
php composer
composer require zoujingli/ip2region
总结
Ip2region 是一个离线IP地址定位库,聚合了一些开放的IP到地名查询提供商的数据,并提供了标准化的数据格式,和各种不同编程语言的的查询实现,提供了极为便捷的开源IP地理位置查询库。
当然,该项目基本属于个人开源项目,重点在于研究IP数据的存储设计和各种语言的查询实现,数据库的更新也依赖于作者,其不保证及时的数据更新,没有也不会有商用版本,开发者可以使用自定义的数据导入ip2region进行自定义查询的实现。