Coder Social home page Coder Social logo

lionsoul2014 / ip2region Goto Github PK

View Code? Open in Web Editor NEW
15.9K 446.0 2.7K 81.13 MB

Ip2region (2.0 - xdb) is a offline IP address manager framework and locator, support billions of data segments, ten microsecond searching performance. xdb engine implementation for many programming languages

License: Apache License 2.0

C 15.64% Java 12.69% PHP 5.40% Python 9.28% JavaScript 3.83% Go 16.01% C# 8.30% Makefile 0.53% Rust 5.86% Shell 0.03% Lua 8.79% Batchfile 0.06% Erlang 4.27% Perl 0.11% C++ 9.20%
java php clang golang ip-address ip-lookup ip-location c rust ip-address-database

ip2region's Introduction

Ip2region 是什么

ip2region - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。

Ip2region 特性

1、IP 数据管理框架

xdb 支持亿级别的 IP 数据段行数,默认的 region 信息都固定了格式:国家|区域|省份|城市|ISP,缺省的地域信息默认是0。 region 信息支持完全自定义,例如:你可以在 region 中追加特定业务需求的数据,例如:GPS信息/国际统一地域信息编码/邮编等。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据。

2、数据去重和压缩

xdb 格式生成程序会自动去重和压缩部分数据,默认的全部 IP 数据,生成的 ip2region.xdb 数据库是 11MiB,随着数据的详细度增加数据库的大小也慢慢增大。

3、极速查询响应

即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别,可通过如下两种方式开启内存加速查询:

  1. vIndex 索引缓存 :使用固定的 512KiB 的内存空间缓存 vector index 数据,减少一次 IO 磁盘操作,保持平均查询效率稳定在10-20微秒之间。
  2. xdb 整个文件缓存:将整个 xdb 文件全部加载到内存,内存占用等同于 xdb 文件大小,无磁盘 IO 操作,保持微秒级别的查询效率。

xdb 数据查询

API 介绍,使用文档和测试程序请参考对应 searcher 查询客户端下的 ReadMe 介绍,全部查询 binding 实现情况如下:

Ok? 状态 编程语言 描述 贡献者
已完成 golang golang xdb 查询客户端实现 Lion
已完成 php php xdb 查询客户端实现 Lion
已完成 java java xdb 查询客户端实现 Lion
已完成 lua 纯 lua xdb 查询客户端实现 Lion
已完成 c ANSC c xdb 查询客户端实现 Lion
已完成 lua_c lua c 扩展 xdb 查询客户端实现 Lion
已完成 rust rust xdb 查询客户端实现 gongzhengyang
已完成 python python xdb 查询客户端实现 厉害的花花
已完成 nodejs nodejs xdb 查询客户端实现 Wu Jian Ping
已完成 csharp csharp xdb 查询客户端实现 Alen Lee
已完成 erlang erlang xdb 查询客户端实现 leihua996
    待开始 php_ext php c 扩展 xdb 查询客户端实现 待确定
已完成 nginx nginx 扩展 xdb 查询客户端实现 Wu Jian Ping
已完成 C++ C++ xdb 查询客户端实现 Yunbin Liu

以下工具链实现由社区开发者通过第三方仓库贡献:

Ok? 状态 编程语言 描述 贡献者
已完成 ruby-ip2region ruby xdb 查询客户端实现 jicheng1014
已完成 Ip2regionTool ip2region数据转换工具 orestonce

xdb 数据生成

API 介绍,使用文档和测试程序请参考如下 maker 生成程序下的 ReadMe 文档:

Ok? 状态 编程语言 描述 贡献者
已完成 golang golang xdb 生成程序实现 Lion
已完成 java java xdb 生成程序实现 Lion
    待开始 c ANSC c xdb 生成程序实现 Lion
已完成 python python xdb 生成程序实现 leolin49
已完成 csharp csharp xdb 生成程序实现 Alan Lee
已完成 rust rust xdb 生成程序实现 KevinWang
已完成 C++ C++ xdb 生成程序实现 Yunbin Liu

xdb 数据更新

ip2region 旨在于 研究 IP 数据的存储和快速查询的设计和实现,并没有原始 IP 数据的支撑,也不会有商用版本。 本项目的自带的 ./data/ip.merge.txt 原始数据已经很久没有更新,也不会再更新,对于数据精度和更新频率要求很高的使用场景建议购买第三方商用数据,你可以使用如下几种方式来尝试自己更新数据:

手动编辑更新

你可以基于 ip2region 自带的 ./data/ip.merge.txt 原始 IP 数据用 ip2region 提供的编辑工具来自己修改,目前数据源有如下几种方式:

  1. ip2region 社区提供的数据(请参考地底部的公众号关注社区通知)
  2. ip2region Github/Gitee 中带有 [数据源补充] 标签的 Issue
  3. 其他自定义数据:例如客户提供的数据,或者通过 GPS 和 WIFI 定位得到的数据,或者来自其他平台的合法合规的数据

原始 IP 数据编辑工具使用方法请参考如下的 maker 生成程序下的 ReadMe 文档:

Ok? 状态 编程语言 描述 贡献者
已完成 golang golang 原始 IP 数据编辑器 Lion
    待开始 java java 原始 IP 数据编辑器 Lion
已完成 C++ C++ 原始 IP 数据编辑器 Yunbin Liu

检测自动更新

如果你想通过你自己的 API 或数据源来更新数据,你可以参考以下视频分享的 基于检测算法 的更新算法来自己编写一个更新程序:

  1. 数据更新实现视频分享 - part1
  2. 数据更新实现视频分享 - part2

相关备注

1、并发查询必读

xdb 整个缓存的查询都 并发安全的,基于文件的查询都 不是 并发安全的实现,不同进程/线程/协程需要通过创建不同的查询对象来安全使用,并发量很大的情况下,基于文件查询的方式可能会导致打开文件数过多的错误,请修改内核的最大允许打开文件数(fs.file-max=一个更高的值),或者将整个xdb加载到内存进行安全并发使用。

2、技术资源分享

  1. xdb 数据结构分析:“ip2region xdb 数据结构和查询过程详解“
  2. xdb 查询过程分析:“ip2region xdb 数据结构和查询过程详解”
  3. xdb 生成过程分析:“ip2region xdb 二进制数据生成过程详解”
  4. xdb 数据更新方法:“ip2region 数据更新和 xdb 数据编辑器的使用”

3、技术信息博客

请先关注微信公众号 lionsoul-org (狮子的魂)

ip2region's People

Contributors

begeekmyfriend avatar biluohc avatar codingox avatar dependabot[bot] avatar dongyado avatar gongzhengyang avatar heweizhen0822 avatar jwcn avatar kaifulee avatar kevinwl avatar kooooooma avatar leigong996 avatar leolin49 avatar lionsoul2014 avatar lishangbu avatar liuyunbin avatar liyang1009 avatar luckydog6132 avatar malus2077 avatar mohong122 avatar morsmalleo avatar phpstatic avatar rocherkong avatar soar360 avatar stulzq avatar tangerren avatar weideguo avatar wujjpp avatar wuxiaodonggit avatar zzl88824 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ip2region's Issues

定义为全局变量问题

我用的是go的包

region, err := ip2region.New("ip2region.db") 这一句我觉得定义为全局变量。系统启动的时候执行一次加载到内存,之后就不需要再执行了,这样也就只消耗了2M左右的内存,效果是否是最好的?

如果每次请求都要执行一次上面的操作,相当于每次都会有一次打开文件的操作吧?当并发量非常大的时候,文件描述符打开太多,就会报 open too many file 的错误了

当我用定义成全局变量

var Region, _ = ip2region.New("ip2region.db")

在做benchmark 测试的时候, 得到了 和你的测试结果一致的结果,MemorySearch 是最快的

[php7.1]pointer being freed was not allocated

Mac下Brew的php71装完php -m 报错如下:

php(55947,0x7fff9bb2a3c0) malloc: *** error for object 0x7faabb817200: pointer being freed was not allocated

环境如下:

PHP 7.1.0 (cli) (built: Dec  2 2016 11:32:42) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies

160.19.212 段不在日本

比如 160.19.212.227

ip.taobao.com 查询在日本

ipip.net 查询是正确的:
**北京 hexinmi.com 联通
AS9929 160.19.212.0/22 CNCNET-CN China Netcom Corp., CN

关于命名问题

binding 一般是指一种语言不实现相关逻辑包装了另一种语言的代码,比如 Python 通过 cffi 来包装 C 语言的库。看了下代码现在这几种语言都不是用 binding 的方式实现的,所以叫 implementation 或者叫 impls 或者叫 lang

还有 python 实现的文件名不是蛇型小写字母的。

How to deploy this lib?

You know that since we're deploying our lib to the public, however how to publish the db? When you use Install-Package xxx or npm i. It won't install db file?

What do u think of this?

程序里使用,与jar包结果不同

我使用maven引入了1.4.jar的包,进行了一点点小小的封装,生成一个可以使用的接口,但是扫描同一IP时会出现使用jar包扫描出结果,使用程序调试却没有结果的现象。我可以确定ip2region.db是一致的。问题如下图(测试地址为218.30.222.25):
_15360297104513
_15360300997651

golang执行测试报错

binging/golang 下面两个包了,按照readme执行测试代码会报错,建议分别放到不同路径下

最新版ip.merge.txt有部分IP数据不正确

最新版ip.merge.txt,有几行的ip起止端不正确,起始ip大于终止ip,如下:

"17.72.133.213";"17.72.127.255";"法国";"0";"0";"0";"0";"";"";""
"103.66.56.166";"103.66.56.106";"印度尼西亚";"0";"0";"0";"0";"";"";""
"103.66.142.9";"103.66.131.255";"泰国";"0";"0";"0";"0";"";"";""
"103.73.172.44";"103.73.168.61";"柬埔寨";"0";"0";"0";"0";"";"";""
"103.75.152.97";"103.75.151.255";"新加坡";"0";"0";"0";"0";"";"";""
"103.76.158.192";"103.76.151.255";"印度尼西亚";"0";"0";"0";"0";"";"";""
"103.82.27.210";"103.80.20.130";"香港";"0";"香港特别行政区";"0";"Hong Kong Internet Exchange";"";"";""
"173.222.109.200";"173.222.102.234";"西班牙";"0";"0";"0";"0";"";"";""

What is the source of the database?

It is having a hard time resolving regions other than China based IP address. For example:

example 1 (USA):

ip2region>> 8.8.8.8
166|美国|0|0|0|Level3 in 1.308838 millseconds

example 2 (Canada):

ip2region>> 207.189.25.17
166|美国|0|0|0|0 in 0.139160 millseconds

example 3 (Hungary):

ip2region>> 91.219.237.244
64|匈牙利|0|0|0|0 in 0.140625 millseconds

从classpath中加载数据库文件

java 怎么从classpath加载文件,

URL dbURL = IpUtils.class.getClassLoader().getResource("data/ip2region.db");
searcher = new DbSearcher(new DbConfig(), dbURL.getFile());

这个加载不到,请问怎么解决

C#/.Net

this is a good project.Is there any plan about .Net Support?

Your code has a buffer overrun bug

If I passed in a random and long string, it will cause buffer overrun.

buffer is allocated at ip2region/binding/c/ip2region.c::389
buffer will be overran at ip2region/binding/c/ip2region.c::406

golang sdk 并发问题

golang sdk 存在并发安全问题

region 设置为全局变量

region, err := ip2region.New(file)

后面多次并发调用搜索

BinarySearch:

QQ20180813-141437@2x.png

BtreeSearch:

QQ20180813-141551@2x.png

MemorySearch 测试表明是并发安全的

QQ20180813-141735@2x.png

提个需求

关于IP查询,返回对应的地理位置经度和纬度,为何不做这个需求呢?

Java heap space

byte[] iBuffer = new byte[blockLen + blen];
java.lang.OutOfMemoryError: Java heap space
这个怎么解决?

lua error

\lualib\resty\Ip2region.lua:314: attempt to call method 'seek' (a nil value)

1、测试环境:windows 、openresty-1.13.6.2-win64 、lua 版本是5.1.5 ,lua位库使用的是外部bitlib.dll计算
因为目前windows openresty 最高版本是5.1.5

city_id 匹配兼容性不强

由于原始数据格式并不统一,导致大量 city_id 无法匹配。比如
有的IP数据是所在地是大理,而csv里面只有大理市,导致 city_id 为 0
还有比如说 阿拉善,csv里面只有 阿拉善盟,city_id 也为 0

城市id查出来都是0

我看db识别出来城市id都是0,有计划支持吗?我这边可以帮忙。🤦‍♀️

SpringBoot 中使用,无法取得文件路径

由于 SpringBoot 的启动方式是 fat jar,不会解压文件到磁盘,从 Java 内部读取资源文件最好使用相对路径,看了ip2region读取 db 文件使用的RandomAccessFile来读取,恰好RandomAccessFile只支持从绝对路径读取文件流,所有无法找到正确的 db data 文件位置

private static final String dbFilePath = "data/ip2region.db";

    /**
     * 初始化 IP 地址搜索对象
     *
     * @return
     * @throws DbMakerConfigException
     * @throws FileNotFoundException
     */
    @Bean
    public DbSearcher ipSearcher() throws DbMakerConfigException, FileNotFoundException {

        String dbPath = ResourceUtils.getFile("classpath:" + dbFilePath).getPath();

        DbConfig config = new DbConfig();

        log.info("[IP-Address-Search-1] start.");
        return new DbSearcher(config, dbPath);
    }

异常信息如下:

java.io.FileNotFoundException: file:/app.jar!/BOOT-INF/classes!/data/ip2region.db (No such file or directory)

并发性能问题

大佬你好,我循环几万次查询,发现总共耗时很高(好几秒),有时候不能忍了,不知道大佬这方面测试了木有呢~
start_time = time.time()
for i in range(20000):
start = time.time()
locations = searcher.memorySearch("182.61.62.41")
print time.time() - start_time
但是,对比于ipipnet查询不超过1秒,这方面是不是有优化空间呢?感谢哈🙏

103.107.104.0 IP段识别错误

识别到印度了,
ip2region>> 103.107.104.0
20|印度|0|0|0|0 in 0.03735 millseconds

其实是香港的。
ip138.com IP查询(搜索IP地址的地理位置)
您查询的IP:103.107.104.0
本站数据:香港特别行政区
参考数据1:亚太地区亚太地区
参考数据2:APNIC

IP地址段存在包含的问题

11.8.0.0|11.11.255.255|**|XX|YY|0|0
11.8.32.58|11.8.32.58|**|XX|YY|Z|0
11.8.33.15|11.8.33.15|**|XX|Z2|0|0

以上三个IP地址段,第一个IP包含了后面的两个。
但是查询11.9.11.1是查询不到,python返回N2

速度挑战

git clone https://github.com/ExodusVPN/ip-db.git
cd ip-db
cargo build --bin iana --release
target/debug/iana lookup "23.18.0.0"
target/debug/iana lookup "2001:258:4000::"
cargo bench

查询 IPv4/IPv6 的平均耗时是 50ns - 60ns .

image

😆

php 扩展问题

想请教下php 扩展,
扩展在加载数据文件时,
是一次加载后长驻?
还是每次调用都读一次?
1.如果是每次都读数据文件,那是否可以通过设置搞成长驻的.

因为我部份脚本应用时,需要长驻.也就是你的mem方式

如何支持 piwik 呢?

如题 0.0
Piwik 上似乎并没有什么靠谱的免费的 ip 转地理位置的方法。。
看到这个又不知道怎么用 0.0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.