Ip2region - 准确率99.9%的离线IP地址定位库

资源 itjs 2022-03-15 10:14 641 0

对于从事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毫秒级别,内置了三种查询算法:

  1. memory算法:整个数据库全部载入内存,单次查询都在0.1x毫秒内,C语言的客户端单次查询在0.00x毫秒级别。

  2. binary算法:基于二分查找,基于ip2region.db文件,不需要载入内存,单次查询在0.x毫秒级别。

  3. 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进行自定义查询的实现。