最新手机号段归属地数据库 (2021年4月版) 473101行

article/2025/9/24 12:36:08
最新手机号段归属地数据库(2021年4月发行版) 473101行
基于:最新手机号段归属地数据库 名称:手机号码归属地查询 dat高效率查询 压缩:原版txt为25M,生成这种dat结构为2.86M 性能:每秒解析300w+ ,简洁高效 创建:qqzeng-ip

开发参考  手机归属地查询 c#  java php 解析dat  内存优化版
快速内存数据库Redis版   以及 导入数据库 mysql mssql 脚本

    微信小程序 号段归属地查询

最新手机号段归属地数据库 

最新 手机号段数据库 号码归属地数据库 移动号段 联通号段 电信号段 虚拟运营商

权威 全面 准确 规范

字段包括 省份 城市 运营商 邮编 区号 等信息,对于数据分析、号码归属地查询等非常有帮助

更新历史:

2021-04-01 473101条记录   xlsx+txt+csv+mysql+mssql
2021-03-01 472529条记录 
2021-02-01 472019条记录 
2021-01-01 471402条记录
2020-12-01 465883条记录 
2020-11-01 464737条记录 
2020-10-01 463471条记录
2020-09-01 459519条记录 
2020-08-15 458461条记录 
2020-08-01 458084条记录
2020-07-15 458020条记录
2020-07-01 457441条记录
2020-06-15 455731条记录
2020-06-01 454802条记录
2020-05-01 450433条记录
2020-04-01 450175条记录
2020-03-01 447897条记录
2020-01-01 442612条记录
2019-12-01 441831条记录
2019-11-01 439265条记录
2019-10-01 439025条记录
2019-09-01 438615条记录
2019-08-01 437124条记录
2019-07-01 436804条记录
2019-06-01 430826条记录
2019-05-01 429052条记录
2019-04-01 424014条记录
2019-03-01 423850条记录
2019-02-01 423766条记录
2019-01-01 421973条记录
2018-12-01 415967条记录
2018-11-01 415806条记录 
2018-10-01 415311条记录 
2018-09-01 413015条记录
2018-08-01 411856条记录
2018-07-01 410765条记录
2018-06-01 405385条记录
2018-05-01 398209条记录
2018-04-01 387892条记录
2018-03-01 382140条记录

…………
2017-07-01 363952条记录
2017-06-01 362386条记录
2017-05-01 359938条记录
…………
2013-04-01 279680条记录
2013-03-01 276893条记录
2013-02-01 275967条记录
2013-01-01 274995条记录
2012-12-01 274832条记录
…………

 

移动号段:
134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 195 198
联通号段:
130 131 132 145 146 155 156 166 167 171 175 176 185 186 196
电信号段:
133 149 153 173 174 177 180 181 189 191 193 199
虚拟运营商:
162 165 167 170 171

字段样例

//名称:手机号码归属地查询 dat高效率查询  内存优化版
//压缩:原版txt为22M,生成这种dat结构为2.66M 
//性能:每秒解析300万+号段或者号码,简洁高效 
//环境:CPU i7-7700K +内存16GB
//创建:qqzeng-ip using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;namespace qqzeng_phone_dat
{public class PhoneSearchFast{private static readonly Lazy<PhoneSearchFast> lazy = new Lazy<PhoneSearchFast>(() => new PhoneSearchFast());public static PhoneSearchFast Instance { get { return lazy.Value; } }private PhoneSearchFast(){LoadDat();Watch();}private string datPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"qqzeng-phone.dat");private DateTime lastRead = DateTime.MinValue;private long[,] prefmap = new long[200, 2];//  000-199private long[,] phonemap;private byte[] data;private long[] phoneArr;private string[] addrArr;private string[] ispArr;/// <summary>/// 初始化二进制dat数据/// </summary>/// <param name="dataPath"></param>/// private void LoadDat(){data = File.ReadAllBytes(datPath);long PrefSize = BytesToLong(data[0], data[1], data[2], data[3]);long RecordSize = BytesToLong(data[4], data[5], data[6], data[7]);long descLength = BytesToLong(data[8], data[9], data[10], data[11]);long ispLength = BytesToLong(data[12], data[13], data[14], data[15]);//内容数组int descOffset = (int)(16 + PrefSize * 9 + RecordSize * 7);string descString = Encoding.UTF8.GetString(data, descOffset, (int)descLength);addrArr = descString.Split('&');//运营商数组int ispOffset = (int)(16 + PrefSize * 9 + RecordSize * 7 + descLength);string ispString = Encoding.UTF8.GetString(data, ispOffset, (int)ispLength);ispArr = ispString.Split('&');//前缀区int m = 0;for (var k = 0; k < PrefSize; k++){int i = k * 9 + 16;int n = data[i];prefmap[n, 0] = BytesToLong(data[i + 1], data[i + 2], data[i + 3], data[i + 4]);prefmap[n, 1] = BytesToLong(data[i + 5], data[i + 6], data[i + 7], data[i + 8]);if (m < n){for (; m < n; m++){prefmap[m, 0] = 0; prefmap[m, 1] = 0;}m++;}else{m++;}}//索引区phoneArr = new long[RecordSize];phonemap = new long[RecordSize, 2];for (int i = 0; i < RecordSize; i++){long p = 16 + PrefSize * 9 + (i * 7);phoneArr[i] = BytesToLong(data[p], data[1 + p], data[2 + p], data[3 + p]);phonemap[i, 0] = data[4 + p] + ((data[5 + p]) << 8);phonemap[i, 1] = data[6 + p];}}private void Watch(){FileInfo fi = new FileInfo(datPath);FileSystemWatcher watcher = new FileSystemWatcher(fi.DirectoryName){IncludeSubdirectories = false,NotifyFilter = NotifyFilters.LastWrite,Filter = "qqzeng-phone.dat",};watcher.Changed += (s, e) =>{var lastWriteTime = File.GetLastWriteTime(datPath);if (lastWriteTime > lastRead){//延时 解决 正由另一进程使用,因此该进程无法访问此文件Thread.Sleep(1000);LoadDat();lastRead = lastWriteTime;}};watcher.EnableRaisingEvents = true;}/// <summary>/// 号段查询/// </summary>/// <param name="phone">7位或者11位</param>/// <returns></returns>public string Query(string phone){long pref;long val = PhoneToInt(phone, out pref);long low = prefmap[pref, 0], high = prefmap[pref, 1];if (high == 0){return "";}long cur = low == high ? low : BinarySearch(low, high, val);if (cur != -1){return addrArr[phonemap[cur, 0]] + "|" + ispArr[phonemap[cur, 1]];}else{return "";}}/// <summary>/// 二分算法/// </summary>private int BinarySearch(long low, long high, long key){if (low > high)return -1;else{long mid = (low + high) / 2;long phoneNum = phoneArr[mid];if (phoneNum == key)return (int)mid;else if (phoneNum > key)return BinarySearch(low, mid - 1, key);elsereturn BinarySearch(mid + 1, high, key);}}private long PhoneToInt(string phone, out long prefix){//最高性能char ch;long currentValue = 0;long prefval = 0;unsafe{fixed (char* name = phone){for (int current = 0; current < 7; current++){ch = name[current];int digitValue = ch - '0';currentValue = (currentValue * 10) + digitValue;if (current == 2){prefval = currentValue;}}}prefix = prefval;return currentValue;}//prefix = Convert.ToUInt32(phone.Substring(0,3));//return Convert.ToUInt32(phone.Substring(0, 7)); ;}/// <summary>/// 字节转整形 小节序 /// </summary>     private uint BytesToLong(byte a, byte b, byte c, byte d){return (uint)(a | (b << 8) | (c << 16) | (d << 24));}}/*(调用例子):    string result = PhoneSearchFast.Instance.Query("号段|号码");--> result="省份|城市|区号|邮编|行政区划代码|运营商"*/
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace qqzeng_phone_dat
{public class PhoneSearch{private Dictionary<uint, PrefixIndex> prefixDict;private byte[] indexBuffer;private byte[] data;long firstPhoneOffset;//索引区第一条流位置long lastPhoneOffset;//索引区最后一条流位置long prefixStartOffset;//前缀区第一条的流位置long prefixEndOffset;//前缀区最后一条的流位置long phoneCount;       //号段段数量long prefixCount;  //前缀数量/// <summary>/// 初始化二进制dat数据/// </summary>/// <param name="dataPath"></param>public PhoneSearch(string dataPath){using (FileStream fs = new FileStream(dataPath, FileMode.Open, FileAccess.Read, FileShare.Read)){data = new byte[fs.Length];fs.Read(data, 0, data.Length);}firstPhoneOffset = BytesToLong(data[0], data[1], data[2], data[3]);lastPhoneOffset = BytesToLong(data[4], data[5], data[6], data[7]);prefixStartOffset = BytesToLong(data[8], data[9], data[10], data[11]);prefixEndOffset = BytesToLong(data[12], data[13], data[14], data[15]);phoneCount = (lastPhoneOffset - firstPhoneOffset) / 8 + 1; //索引区块每组 8字节          prefixCount = (prefixEndOffset - prefixStartOffset) / 9 + 1; //前缀区块每组 9字节//初始化前缀对应索引区区间indexBuffer = new byte[prefixCount * 9];Array.Copy(data, prefixStartOffset, indexBuffer, 0, prefixCount * 9);prefixDict = new Dictionary<uint, PrefixIndex>();for (var k = 0; k < prefixCount; k++){int i = k * 9;uint prefix = (uint)indexBuffer[i];long start_index = BytesToLong(indexBuffer[i + 1], indexBuffer[i + 2], indexBuffer[i + 3], indexBuffer[i + 4]);long end_index = BytesToLong(indexBuffer[i + 5], indexBuffer[i + 6], indexBuffer[i + 7], indexBuffer[i + 8]);prefixDict.Add(prefix, new PrefixIndex() { prefix = prefix, start_index = start_index, end_index = end_index });}}public static uint PhoneToInt(string phone, out uint prefix){prefix = Convert.ToUInt32(phone.Substring(0, 3));return Convert.ToUInt32(phone.Substring(0, 7)); ;}/// <summary>/// 号段查询/// </summary>/// <param name="phone">7位或者11位</param>/// <returns></returns>public string Query(string phone){uint phone_prefix_value;uint intPhone = PhoneToInt(phone, out phone_prefix_value);uint high = 0;uint low = 0;uint local_offset = 0;uint local_length = 0;if (prefixDict.ContainsKey(phone_prefix_value)){low = (uint)prefixDict[phone_prefix_value].start_index;high = (uint)prefixDict[phone_prefix_value].end_index;}else{return "";}uint my_index = low == high ? low : BinarySearch(low, high, intPhone);GetIndex(my_index, out local_offset, out local_length);return GetLocal(local_offset, local_length);}/// <summary>/// 二分算法/// </summary>public uint BinarySearch(uint low, uint high, uint k){uint M = 0;while (low <= high){uint mid = (low + high) / 2;uint phoneNum = GetIntPhone(mid);if (phoneNum >= k){M = mid;if (mid == 0){break;   //防止溢出}high = mid - 1;}elselow = mid + 1;}return M;}/// <summary>/// 在索引区解析/// </summary>/// <param name="left">ip第left个索引</param>/// <param name="startip">返回开始ip的数值</param>/// <param name="endip">返回结束ip的数值</param>/// <param name="local_offset">返回地址信息的流位置</param>/// <param name="local_length">返回地址信息的流长度</param>private void GetIndex(uint left, out uint local_offset, out uint local_length){long left_offset = firstPhoneOffset + (left * 8);local_offset = (uint)data[4 + left_offset] + (((uint)data[5 + left_offset]) << 8) + (((uint)data[6 + left_offset]) << 16);local_length = (uint)data[7 + left_offset];}/// <summary>/// 返回归属地信息/// </summary>/// <param name="local_offset">地址信息的流位置</param>/// <param name="local_length">地址信息的流长度</param>/// <returns></returns>private string GetLocal(uint local_offset, uint local_length){byte[] buf = new byte[local_length];Array.Copy(data, local_offset, buf, 0, local_length);return Encoding.UTF8.GetString(buf, 0, (int)local_length);// return Encoding.GetEncoding("GB2312").GetString(buf, 0, (int)local_length);}private uint GetIntPhone(uint left){long left_offset = firstPhoneOffset + (left * 8);return BytesToLong(data[0 + left_offset], data[1 + left_offset], data[2 + left_offset], data[3 + left_offset]);}/// <summary>/// 字节转整形 小节序 /// </summary>     private uint BytesToLong(byte a, byte b, byte c, byte d){return ((uint)a << 0) | ((uint)b << 8) | ((uint)c << 16) | ((uint)d << 24);}}/*(调用例子):PhoneSearch finder = new PhoneSearch("qqzeng-phone.dat");string result = finder.Query("号段或者号码");--> result="省份|城市|运营商|区号|邮编|行政区划代码"*/
}
普通版 每秒200w+

开发:https://github.com/zengzhan/qqzeng-ip


http://chatgpt.dhexx.cn/article/pix6JkCn.shtml

相关文章

extern关键字

extern的使用详解&#xff08;多文件编程&#xff09;——C语言 extern——关键字 extern是C语言中的一个关键字&#xff0c;一般用在变量名前或函数名前&#xff0c;作用是用来说明“此变量/函数是在别处定义的&#xff0c;要在此处引用”&#xff0c;extern这个关键字大部分…

extern关键字用法详解

extern关键字会提升变量或者函数的逼格&#xff0c;使得它们可以跨文件被访问。话虽然是这么说&#xff0c;使用这个关键字必须要注意一些东西。 首先&#xff0c;你得在cpp文件里面实现这些全局变量和全局函数&#xff0c;这是最基本的&#xff0c;然后只需要在需要用到这些变…

extern 声明用法

变量声明向编译器保证变量以给定的类型和名称存在&#xff0c;这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义&#xff0c;在程序连接时编译器需要实际的变量声明。 当您使用多个文件且只在其中一个文件中定义变量时&#xf…

extern C语言的用法

extern用作从其他.c文件调用变量&#xff08;一般是全局变量&#xff09;和调用其他.c文件的函数&#xff08;当然不能调用其他.c文件的main函数哈哈哈哈哈哈&#xff09; 比如从test.c文件要从test1.c文件调用test1.c文件的int te全局变量和test1.c文件的Print()函数&#xff…

【C语言】extern 关键字

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

extern和static的用法

一&#xff1a;static static有两种使用&#xff1a;一种是修饰变量&#xff0c;另一种是修饰函数 1.修饰变量&#xff1a;作用是使得该变量在出了其作用范围后不会被销毁 第一种是修饰局部变量&#xff1a; 普通的局部变量是存储在栈区的&#xff0c;但是通过static修饰之后…

extern用法

1.extern变量&#xff0c;extern函数 extern 最简单的用法就是在一个文件中引用另一个文件中的变量或者函数。 首先我们要知道一个概念&#xff1a;声明可以有多次&#xff0c;定义只能有一次。 1.1extern变量 先来谈谈extern变量。 ① int a; ② int a 0; ③ extern int a…

C语言学习之extern关键字

1.了解extern 1.extern是C语言的一个关键字&#xff0c;可以用来修饰函数与变量 2.当extern修饰一个变量或函数时时&#xff0c;就是在声明这个变量(函数)&#xff0c;告诉编译器在外部文件中已经这个变量(函数)&#xff0c;要通过编译。 2.extern的用法 1.在一个文件中引用其…

extern关键字的一般用法

extern关键字会提升变量或者函数的逼格&#xff0c;使得它们可以跨文件被访问。话虽然是这么说&#xff0c;使用这个关键字必须要注意一些东西。 首先&#xff0c;你得在cpp文件里面实现这些全局变量和全局函数&#xff0c;这是最基本的&#xff0c;然后只需要在需要用到这些变…

C++中的extern

文章目录 extern的含义修饰全局变量修饰全局常量修饰局部变量修饰字符串C代码C代码 想必大家都知道&#xff0c;在C中&#xff0c;想要生成一个可执行文件&#xff08;exe&#xff09;或者动态链接库&#xff08;dll&#xff09;&#xff0c;需要经过编译和链接两个步骤&#x…

extern使用方法总结!

一、问题 Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义&#xff1f; 二、详解 1、函数的声明extern关键词是可有可无的&#xff0c;因为函数本身不加修饰的话就是extern。但是引用的时候一样需要声明的。 2、全局变量在外部使用声明时&#xff0c;extern关键…

extern详解

extern——关键字 extern是C语言中的一个关键字&#xff0c;一般用在变量名前或函数名前&#xff0c;作用是用来说明“此变量/函数是在别处定义的&#xff0c;要在此处引用”&#xff0c;extern这个关键字大部分读者应该是在变量的存储类型这一类的内容中 遇到的&#xff0c;…

【014 关键字】一文彻底搞懂extern用法

一、定义和声明的区别 声明&#xff1a;用来告诉编译器变量的名称和类型&#xff0c;而不分配内存&#xff0c;不赋初值。 定义&#xff1a;为了给变量分配内存&#xff0c;可以为变量赋初值。 注&#xff1a;定义要为变量分配内存空间&#xff1b;而声明不需要为变量分配内…

HDU AWR电磁场与微波实验 操作记录

类型 滤波器版图设计功放设计IV曲线创建偏置电路&添加原理图背面注释添加谐波平衡端口添加双音激励端口 实验课需要使用这款软件 记录一下&#xff0c;提醒自己如何操作 工程文件如下 &#xff0c;0积分 滤波器. 版图. 功放. 交指滤波器. 滤波器 • Creating a schematic …

达梦AWR使用

DBMS_WORKLOAD_REPOSITORY 包 1、概述 AWR默认是关闭的需要受到开启&#xff0c;如 果 需 要 开 启 &#xff0c; 则 调 用 DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL 过 程 设 置 快 照 的 间 隔 时 间 。 DBMS_WORKLOAD_REPOSITORY 包还负责 snapshot&#xff08;快照&…

AWR(性能报告)

本文章为网络笔记&#xff0c;看了warehouse老师的视频受益匪浅&#xff0c;更是感觉自己技术太过初级&#xff0c;特写了本笔记&#xff0c;方便以后反复学习&#xff01; 如有任何不妥&#xff0c;请发邮件至102448567qq.com删除文章&#xff01; 关于warehouse&#xff1a; …

AWR2243

TDA2xx-AWRx243 TI毫米波板&#xff08;代完善更新和作者的继续研究&#xff09; 1、安装mmwave studio和驱动&#xff08;链接&#xff1a; https://download.csdn.net/download/weixin_42501561/19775644 &#xff09; 2、设置网络端口IP地址&#xff08;如果不能更改路由器I…

awr报告

某客户反馈数据库慢&#xff0c;给到一份awr报告。分析如下 每个cpu可用处理时间3501.6s(59.86min)&#xff0c;系统负载为&#xff1a;511(59.86*16)50%,其中16为CPUs direct path read最高&#xff0c;可能有下面三种原因&#xff1a; parallel query大量disk排序table预读取…

awr清理

Oracle并没有真正进行删除AWR报告信息&#xff0c;查询metalink发现是Oracle的bug&#xff0c; Bug 8622802描述了这个问题&#xff0c; 修复版本&#xff1a; #禁用awr报告 EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL > 0); select * from WRM$_SN…

AWR

AWR自动工作量资料档案库: AWR用于收集关于该特定数据库的操作统计信息和其他统计信息&#xff0c;oracle以固定的时间间隔&#xff08;默认60分钟&#xff09;为其所有重要统计信息和负载信息执行一次快照&#xff0c;并将这些快照存储在AWR中。这些信息在AWR中保留给定的时间…