# location **Repository Path**: dengdui/location ## Basic Information - **Project Name**: location - **Description**: 造轮子,提供IP和归属地对应关系、手机号码和归属地关系等相对静态的数据高效查询方法。设计一种数据结构,提供以极低的内存消耗和极快的查询速度。提供一份原始的数据可以直接使用。将数据拷贝和代码拷贝到自己的项目去即可使用。可用于IP归属地显示,手机号码归属地显示等需求的开发提供方法和数据的支撑。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2022-07-04 - **Last Updated**: 2025-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # location ## 介绍 提供IP和归属地对应关系、手机号码和归属地关系等相对静态的数据高效查询方法。设计一种数据结构,提供以极低的内存消耗和极快的查询速度。提供一份原始的数据可以直接使用。将数据拷贝和代码拷贝到自己的项目去即可使用。可用于IP归属地显示,手机号码归属地显示等需求的开发提供方法和数据的支撑。 ## 特点 - 极小压缩内存 IPv4定位源数据仅仅3M多一点,国内IP定位到省级,国外定位到国家级别。号码归属地查询源数据仅仅2M多一点,能定位到市级 - 极少代码、简单易懂 只有关键d代码不到两百行。简单易懂,注释清楚。只依赖JDK,不需要引入其他依赖,直接复制代码到自己项目即可使用。完全可控, - 扩展好 提供spring boot使用示例,开箱即用,还可以构建自己项目所需要的数据,增加或者减少数量量,比如IP定位项目里源数据只提供到省,想做到市级可简单扩展构建。 ## 项目运行 1. git clone https://gitee.com/eedui/location.git 2. 本地运行 3. 浏览器访问体验 http://127.0.0.1:8080/currentIpLocation http://127.0.0.1:8080/ipLocation?ip=120.239.72.20 http://127.0.0.1:8080/phoneLocation?phone=13125156666 ## 引入说明 1. 将类IndexHeader、MemoryIndex直接拷到自己项目代码工程里。做为数据解析的类和查询的入口 2. 将resources目录下的db目录拷贝到自己工程目录下的resources目录下,做为读取的数据源 3. 整个项目构建唯一一个MemoryIndex的实例之后引入调用相应的方法即可。可以参考项目中LocationConfig配置的bean用法,将MemoryIndex作为一个单例的bean使用(由于MemoryIndex是直接将数据全部加载到内存中,一定要单例使用否则可能会占用大量内存,由于只涉及内存的查询操作所以不存在线程安全问题) ## 实现介绍 IP是全球统一的,具有全球唯一性,为了保证唯一性要统一做分配,需要IP都去统一分配系统申请,一些比较大组织会一次申请大量的IP之后再进一步分给别人。IP地址申请需要进行实名登记,包括组织地址等信息,这个信息可以做为最初的归属地信息来源。后续可以通过使用IP的设备定位信息等手段更新IP的归属地。总之IP归属地信息具备局部相同性,即会存在大批量连续的IP归属地是一样的。根据这个特新可以将IP地址和归属地对于关系浓缩到一小块内存中并且排序使用二分法快速定位到IP归属地。 本项目基于这个思路进行实现,按照如下格式保存起来,其中前两位byte为数据头,记录版本号、数据的编码方式、所以字节数、数据长度范围、索引的长度等信息。之后就是索引数据,根据主键进行有序排列的,并且保存索引对应数据的位置。这样当查询时直接通过二分法直接查询到索引的位置后拿到数据的位置,之后取出数据即可。 号码归属地查询也是类似的方法,号码也是有类似的规律,前7位为号段,比如1300000这个号段山东省济南市的,所以拿到一个号码通过号段即可查询到归属地。 ![输入图片说明](src/main/resources/db/image1.png) ![输入图片说明](src/main/resources/db/image.png)