范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

开源仅数MB,准确率99。9的离线IP地址定位库,0。0x毫秒级查询

  一、开源项目简介
  Ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。二、开源协议
  使用Apache-2.0开源协议三、界面展示
  四、功能概述Ip2region特性99.9%准确率
  数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真IP定位准确一些。
  ip2region的数据聚合自以下服务商的开放API或者数据(升级程序每秒请求次数2到4次):
  01, >80%, 淘宝IP地址库
  02,  10%, GeoIP
  03,  2%, 纯真IP库
  备注: 如果上述开放API或者数据都不给开放数据时ip2region将停止数据的更新服务。 标准化的数据格式
  每条ip数据段都固定了格式: _城市Id|国家|区域|省份|城市|ISP_
  只有中国的数据精确到了城市,其他国家有部分数据只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家(请忽略前面的城市Id,个人项目需求)。 体积小
  包含了全部的IP,生成的数据库文件ip2region.db只有几MB,最小的版本只有1.5MB,随着数据的详细度增加数据库的大小也慢慢增大,目前还没超过8MB。 查询速度快
  全部的查询客户端单次查询都在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算法固然是最快的! 五、技术选型多查询客户端的支持
  已经集成的客户端有: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毫秒 ip2region快速测试
  请参考每个binding下的README说明去运行cli测试程序,例如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
  输入IP地址开始测试,第一次会稍微有点慢,在运行命令后面接入binary,memory来尝试其他算法,建议使用b-tree算法,速度和并发需求的可以使用memory算法,具体集成请参考不同binding下的测试源码。 ip2region安装
  具体请参考每个binding下的README文档和测试demo,以下是一些可用的快捷安装方式: maven仓库地址     org.lionsoul     ip2region     1.7.2 nodejsnpm install node-ip2region --savenuget安装Install-Package IP2Regionphp composer# 插件来自:https://github.com/zoujingli/ip2region composer require zoujingli/ip2regionip2region 并发使用全部binding的各个search接口都 不是 线程安全的实现,不同线程可以通过创建不同的查询对象来使用,并发量很大的情况下,binary和b-tree算法可能会打开文件数过多的错误,请修改内核的最大允许打开文件数(fs.file-max=一个更高的值),或者使用持久化的memory算法。 memorySearch接口,在发布对象前进行一次预查询(本质上是把ip2region.db文件加载到内存),可以安全用于多线程环境。 ip2region.db的生成
  从1.8版本开始,ip2region开源了ip2region.db生成程序的java实现,提供了ant编译支持,编译后会得到以下提到的dbMaker-{version}.jar,对于需要研究生成程序的或者更改自定义生成配置的请参考${ip2region_root}/maker/java内的java源码。
  从ip2region 1.2.2版本开始里面提交了一个dbMaker-{version}.jar的可以执行jar文件,用它来完成这个工作: 确保你安装好了java环境(不玩Java的童鞋就自己谷歌找找拉,临时用一用,几分钟的事情) cd到${ip2region_root}/maker/java,然后运行如下命令: java -jar dbMaker-{version}.jar -src 文本数据文件 -region 地域csv文件 [-dst 生成的ip2region.db文件的目录]  # 文本数据文件:db文件的原始文本数据文件路径,自带的ip2region.db文件就是/data/ip.merge.txt生成而来的,你可以换成自己的或者更改/data/ip.merge.txt重新生成 # 地域csv文件:该文件目的是方便配置ip2region进行数据关系的存储,得到的数据包含一个city_id,这个直接使用/data/origin/global_region.csv文件即可 # ip2region.db文件的目录:是可选参数,没有指定的话会在当前目录生成一份./data/ip2region.db文件获取生成的ip2region.db文件覆盖原来的ip2region.db文件即可 默认的ip2region.db文件生成命令: cd ${ip2region_root}/java/ java -jar dbMaker-1.2.2.jar -src ./data/ip.merge.txt -region ./data/global_region.csv  # 会看到一大片的输出架构原理
  layout
  title
  date
  categories
  tags
  status
  type
  published
  author
  post
  Ip2region 数据库文件结构及原理
  2016-08-18
  tool
  ip定位
  ip2region
  publish
  post
  true
  login
  email
  display_name
  slayer
  dongyado@gmail.com
  slayer
  ip2region 是一个准确率99.9%的ip地址定位库。 0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java, php, c, python查询客户端和Binary,B树,内存三种查询算法。
  本文将分三个部分: 源数据转变成ip2region db 文件的过程 ip2region 的结构 搜索方法 (一). 源数据如何存储到ip2region.db1. 源数据来源与结构
  ip2region 的ip数据来自纯真和淘宝的ip数据库,每次抓取完成之后会生成 ip.merge.txt, 再通过程序根据这个源文件生成ip2region.db 文件。
  ip.merge.txt 中每一行对应一条完整记录,每一条记录由ip段和数据组成,格式如下: 0.0.0.0|0.255.255.255|未分配或者内网IP|0|0|0|0 1.0.0.0|1.0.0.255|澳大利亚|0|0|0|0 1.0.1.0|1.0.3.255|中国|华东|福建省|福州市|电信 1.0.4.0|1.0.7.255|澳大利亚|0|0|0|0 1.0.8.0|1.0.15.255|中国|华南|广东省|广州市|电信 1.0.16.0|1.0.31.255|日本|0|0|0|0 1.0.32.0|1.0.63.255|中国|华南|广东省|广州市|电信 1.0.64.0|1.0.127.255|日本|0|0|0|0 1.0.128.0|1.0.255.255|泰国|0|0|0|0 1.1.0.0|1.1.0.255|中国|华东|福建省|福州市|电信
  从左到右分别表示: 起始ip,结束ip,国家,区域,省份,市,运营商。无数据区域默认为0。
  最新的ip.merge.txt 有122474条记录,并且根据开始ip地址升序排列。 2. 如何生成ip2region.db
  给定一个ip,如何快速从ip.merge.txt中找到该ip所属记录?最简单的办法就是顺序遍历,当该ip在某条记录起始和结束ip之间时,即命中。
  这是低效的做法,如何提高查询性能?用过mysql和其他数据库的的都知道,使用索引。所以ip2region.db使用了内建索引,直接将性能提升到0.0x毫秒级别。
  根据ip.merge.txt,为所有数据生成一份索引,并和数据地址组成一个索引项(index block), 然后按起始ip升序排列组成索引,并存储到数据文件的末尾,最终生成的ip2region.db文件大小只有3.5M。
  此时的数据库文件中的每一条索引都指向一条对应的数据,也就是说如 |中国|华南|广东省|广州市|电信
  这样的数据在文件中被重复存储了很多次,再经过去重优化之后,ip2region.db只有1.5M了,此时把数据库文件全部读取到内存再查找都是非常可行的。 (二). ip2region.db 结构
  生成的ip2region.db文件包含以下四个部分:
  1, SUPER BLOCK
  2, HEADER INDEX
  3, DATA
  4, INDEX
  生成 ip2region.db 的时候,首先会在首部预留 8 bytes 的SUPER BLOCK 和 8k 的 HEADER INDEX。
  再根据ip.merge.txt,依据每一条记录的起始ip, 结束ip和数据,生成一个index block, 前四个字节存储起始ip, 中间四个字节存储结束ip, 后四个字节存储已经计算出的数据地址,并暂存到INDEX区。
  当 INDEX 索引区和 DATA 数据区确定下来之后,再把 INDEX 的起始位置存储到 SUPER BLOCK 的前四个字节,结束位置存储到 SUPER BLOCK 的后四个字节。
  再把 INDEX 分成大小为 4K 的索引分区,把每个分区起始位置的索引的起始ip和该索引的位置存入一个 header index block, 组成 HEADER INDEX 区域, 最后写入ip2region.db。
  具体功能: INDEX 索引区域,索引元素为 index block (12 字节), 分成三个部分,起始ip, 结束ip, 数据信息, 每一条 index block 对应 ip.merge.txt 中的一条记录。 数据信息: 前三个字节保存数据地址(DATA中),后一个字节保存数据长度。 每个index block 表示一个ip段的索引。当指定ip 在某个 index block 的起始ip和结束ip中间,即表示命中索引。 再通过 index block 中的数据地址和数据长度,就能从ip2region.db读取对应的地址。 SUPER BLOCK 用来保存 INDEX 的起始地址和结束地址,first index ptr 指向INDEX起始位置的index block, last index ptr 指向最后一个index block的地址。这样查询的时候直接读取superblock 8个字节,就能快速获取 INDEX 索引区域的地址。 HEADER INDEX HEADER INDEX 区是对 INDEX 区的二级索引, INDEX总长度除以 4K 就是 HEADER INDEX 的实际索引数。 该区域长度为8k, 由 8 bytes 的 header index block 组成。 header index block 前四个字节存储每个4K分区起始位置的index block 的起始ip值,后四个字节指向该index block的地址。 把HEADER INDEX 区定义为8k,可以通过一次磁盘读取读取整个HEADER INDEX 区,然后在内存中进行查询,查询的结果可以确定该ip在INDEX区的某个4k分区内,然后再根据地址一次读取4k index 到内存,再在内存中查询,从而减少磁盘读取的次数。 DATA 保存的数据,数据格式如下:  2163|中国|华南|广东省|深圳市|鹏博士 分别表示 城市ip,国家,区域,省份,城市,运营商 (三). 搜索方法binary搜索
  二分法就不多介绍了,步骤: 把ip值通过ip2long方法转为长整型 通过 SUPER BLOCK 拿到INDEX的起始位置和结束位置 相减+1得出index block 总数 采用二分法直接求解,比较 index block 和当前ip的大小,即可找到该ip属于的 index block 拿到该 index block 的后面四个字节, 分别得到数据长度和数据地址 从数据地址读取拿到的所得长度的字节,即是搜索结果
  以php客户端作为例子注释: <?php     fseek($this->dbFileHandler, 0);      $superBlock = fread($this->dbFileHandler, 8); // 从文件0位置往后读取8字节,即 super block     $this->firstIndexPtr = self::getLong($superBlock, 0); // 获取INDEX起始位置     $this->lastIndexPtr  = self::getLong($superBlock, 4); // 获取INDEX结束位置     $this->totalBlocks   = ($this->lastIndexPtr-$this->firstIndexPtr)/INDEX_BLOCK_LENGTH + 1; // 计算总索引数,即 index block 总数      // 二分法搜索     $l = 0; // 低位     $h = $this->totalBlocks; // 高位     $dataPtr = 0;     while ( $l <= $h  ) {         $m = (($l + $h) >> 1); // 中位         $p = $m * INDEX_BLOCK_LENGTH;         fseek($this->dbFileHandler, $this->firstIndexPtr + $p); // 移动读取位置         $buffer = fread($this->dbFileHandler, INDEX_BLOCK_LENGTH); // 读取 INDEX_BLOCK_LENGTH 个字节 (12 字节), 即读取一个index block         $sip    = self::getLong($buffer, 0); // 获取开始 ip                  // 进行比较         if ( $ip < $sip  ) {             $h = $m - 1; // 比中位index block 开始ip小         } else {             $eip = self::getLong($buffer, 4);             if ( $ip > $eip  ) {                 $l = $m + 1; // 比中位index block 的结束ip小             } else { // 命中数据                 $dataPtr = self::getLong($buffer, 8); // getLong 函数将字节的顺序反过来了                 break;             }         }     }      // 下面这段代码看起来似乎是,第一个字节存储的长度,后三个字节存储的数据位置     // 其实是上文的 getLong 函数在获取数据的时候对字节顺序做了一下反转,具体参考 getLong 函数的代码     // 读取数据      $dataLen = (($dataPtr >> 24) & 0xFF); // 数据长度     $dataPtr = ($dataPtr & 0x00FFFFFF);   // 数据位置      return array(             "city_id" => self::getLong($this->dbBinStr, $dataPtr),  // 获取城市id             "region"  => substr($this->dbBinStr, $dataPtr + 4, $dataLen - 4) // 获取其他数据     ); ?>
  源码请查阅 ip2region php client 的 binarySearch 方法。 b-tree 搜索
  b-tree 搜索用到了 HEADER INDEX,第一步先在 HEADER INDEX 中搜索,再定位到 INDEX 中的某个 4k index分区搜索。
  步骤: 把ip值通过ip2long 转为长整型 使用二分法在 HEADER INDEX 中搜索,比较得到对应的 header index block header index block 指向 INDEX 中的一个 4K 分区,所以直接把搜索范围降低到 4K 采用二分法在获取到的 4K 分区搜索,得到对应的 index block 拿到该 index block 的后面四个字节, 分别得到数据长度和数据地址 从数据地址读取拿到的所得长度的字节,即是搜索结果
  具体源码请查阅 ip2region php client 中的 btreeSearch 方法。 六、源码地址
  访问一飞开源:https://code.exmay.com/

ITX夏日能否HOLD得住9900K风水结合LD03小钢炮装机展示说在前面其实对于这次装机完全是自己出于新奇心的一次瞎折腾,个人真正开始热衷于折腾电脑硬件就是始于银欣的这个结构机箱,初款的乌鸦1对于当初的机箱产业来说可谓是惊艳,颠覆传统机箱的结构关于海燕T241收音机的打理改造想法国庆期间把家父这台T241打理完毕,遂产生了一些改机想法,目前还只是想法,将会不日开工,付诸实践,让老机更好的发挥余热,成功后再详细发文总结。交流声重。该机型使用220V供电,变压德仕博1780简评与改造我之前对德仕博这个品牌毫无所知,猜想应该是东莞的某个小厂,1780应该是出口转内销的机型,因为我看到过国外同款马甲机型,再加上是DSP机,所以并不怎么关注。但是身边却一直有朋友推荐索尼SW77的打理维修经验SW77是索尼90年代初的高端数调机,无论从外观,功能还是内部电路工艺都充满了设计感,有些技术甚至可以说是激进的,贴片电解电容在收音机上的使用就是一个例子。贴片电容体积小,可以提高索尼SW77调幅AGC的起控点调整我之前有发过SW77的电路分析,文中提到它的调幅电路有完善的AGC控制措施,可以根据电台信号强度自动调整高放级增益而不是简单的衰减信号,这种手段似乎更科学合理一些。它的控制信号取自SONYICF5900W电路分析前些天我分享了松下名机RF2200的电路特点,由此自然而然想到了它同期的对飙机型5波段的索尼ICF5900(W)。两台机同属于BCL经典机,同发布于1975年前后只相差几个月。作为索尼CRF160电路分析索尼的便携机系列被命名为ICF,口袋耳机随身听为SRF,CRF系列是桌面级的专业收音机,因此灵敏度和选择性,音质等指标都堪称优秀。这台13波段的CRF160发布于70年代初,采用全一台FM立体声收音机的制作手头多年积攒的各种零件实在太多,扔了又可惜,只能想办法利用了,于是有了这台调频立体声收音机。外壳是网上买的防水盒,价格便宜记得只要十来块钱但是光泽度好坚固耐用,最大好处是易于手工加索尼便携机的同步检波单边带解调分析索尼常见的几款经典数调便携机均支持同步检波和单边带解调,例如SW77,SW07,SW7600G,SW7600GR,SW100,EX5等。当年这些高端功能在模拟便携机上实现是很不容易德生PL660的中波假响应和啸叫分析我之前陆陆续续发了一些德生PL660中波某频点假响应或啸叫的现象视频和初步分析,随着验证的深入,这里总结整理一下我发现这个问题的来龙去脉和原因分析。起初发现啸叫问题,我还怀疑是我这德生PL600电路分析德生PL600电路分析我之前写过德生9700DX,450,550,660,330,990,501,S2000的电路分析文章,因为它们都极具代表性9700DX五年磨一剑有着漂亮的刻度
朋友总是鼓吹苹果,无脑唱衰华为而且还不讲理,应该如何说服她?你应该告诉他,任正非,孟晚粥也用苹果。人家还无脑,就你这种智障还好意思说人家呢?就告诉你一个道理。而且是不容反驳的。在中华人民共和国大陆销售的一切品牌都是合情合理合法国家允许的产品亚马逊良心发现?来看看海外近期物流状亚马逊新举措让你用更少的钱存更多的货云商跨境了解到,近日亚马逊正在美国试验一项物流新举措,即在其运营中心上游新增一个仓储层,从上游仓库向运营中心供货,以实现更多的无缝补货。目前亚马三星现在几乎消失了,苹果会和他一样退出中国市场吗?三星是什么?苹果不是倒闭了?什么乱七八糟的问题。你真幽默呲牙这么无聊的问题让我怎么回答,你怎么知道三星手机消失了,我正用三星手机s10给你回问题!!为什么美国害怕华为,从而全力打压之前加入抖音小店无货源的商家现在如何?一年过去了,还能入场吗?可以肯定的是,抖音小店作为当下抖音电商体系里面最重要的载体,无论从流量机会还是运营模式上,无疑都是现阶段最适合普通人在抖音赚钱的项目。抖音巨大的流量红利,让抖音小店无货源模式门槛变花呗怎么大面积都被停用了,出什么事了吗?转移战场,天天网上骂人家,凭什么用人家花呗我有个朋友说,余额宝里存个50万,花呗不会停的看我的花呗借呗都停了,花呗用了好多年一直好好的,这个突然一下都给停了四万五还没变化刚看了还是币圈那些事俄罗斯中央银行俄罗斯中央银行正计划对数字卢布的交易收取费用金色财经报道,俄罗斯中央银行(CBR)监管机构金融技术部主任KirillPronin透露,俄罗斯中央银行正计划对数字卢布的对标Postman,高瓴资本加持,ApiPost如何引领APIfirst时代作者徐结怀宋荣荣编辑张康随着数字化浪潮快速席卷各行各业,以及研发前后端分离协作成为主流,架起前后端数据流通桥梁的API,呈现出爆发式增长的态势。为了让开发设计测试迭代协同更加高效,跌至6499元,100倍变焦12GB512GB,体验不输华为Mate40Pro了解行情的都知道,在同等配置的情况下,华为手机的售价往往要比其他国产手机品牌更高,但是你会发现,它们的销量并不差,哪怕就是没有5G功能的华为Mate40Pro和P50Pro,销量依黑五大促借双十一预热,跨境电商用什么吸引消费者?对于国内消费者而言,购物节愈发常态化。为吸引消费者,跨境电商也逐步本土化。双11刚结束,黑五购物节又即将开始,各大跨境电商平台包括亚马逊海外购抖音电商京东国际敦煌网天猫国际Newe耳机不知怎么选?青花瓷国潮风的它你可以来看一下耳机怎么选?这确实是一个大大的问题,现如今市面上的耳机种类品牌数不胜数,但是坑坑也很多,几十元的吧是不敢用,几千元的吧买不起,最怕的就是几百块钱买来的耳机还不够理想,小编也是经过踩谷歌Pixel6a渲染图惊艳亮相,Pixel5沦为白菜机创悲惨新纪录此前谷歌Pixel6系列已经正式上市,其靓丽的外观已经得到不少消费者的认可。现在91mobiles已经曝光了该系列手机中中高端Pixel6a的表现,展示了这款手机的外观设计。与此同