最新手机号段归属地数据库 高性能dat解析

article/2025/9/24 11:35:30

 

最新 手机号段数据库  2020-08-15 458461条记录  号码归属地数据库  全面  准确  规范 
字段包括 省份 城市 运营商 邮编 区号 等信息,对于数据分析、号码归属地查询等非常有帮助



名称:手机号码归属地查询 dat高效率查询  内存优化版
压缩:原版txt为22M,生成这种dat结构为2.66M 
性能:每秒解析300万+号段或者号码,简洁高效 
环境:CPU i7-7700K +内存16GB

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="省份|城市|区号|邮编|行政区划代码|运营商"*/
}

 

更新历史: 

2020-08-15 458461条记录
2020-08-01 458084条记录
2020-07-15 458020条记录
2020-07-01 457441条记录
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-09-01 438615条记录
2019-08-01 437142条记录
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 387892条记录
2018-03-01 382140条记录
2018-02-01 381409条记录
2018-01-01 381061条记录
2017-12-01 380357条记录
2017-11-01 369022条记录
2017-10-01 368360条记录
2017-08-01 366454条记录
2017-07-01 363952条记录
2017-06-01 362386条记录
2017-05-01 359938条记录
2017-04-01 359429条记录
2017-03-01 358215条记录
2017-02-01 358006条记录
2017-01-01 357213条记录
2016-12-01 354586条记录
2016-11-01 352898条记录
2016-10-15 352182条记录
2016-09-15 352176条记录
2016-08-15 352069条记录
2016-07-15 344348条记录
2016-06-15 343198条记录
2016-05-15 335588条记录
2016-04-15 335169条记录
2016-03-25 334447条记录
2016-03-01 331878条记录
2016-02-01 329833条记录
2016-01-01 327154条记录
2015-12-01 326601条记录
2015-11-01 326596条记录
2015-10-01 324557条记录
2015-09-01 321602条记录
2015-08-01 320432条记录
2015-07-01 320027条记录
2015-06-01 318201条记录
2015-05-01 318115条记录
2015-04-01 317191条记录
2015-03-01 312145条记录
2015-02-01 311924条记录
2015-01-01 310165条记录
2014-12-01 309966条记录
2014-11-01 309398条记录
2014-10-01 307924条记录
2014-09-01 306093条记录
2014-08-01 301472条记录
2014-07-01 303033条记录
2014-06-01 300635条记录
2014-05-01 299920条记录
2014-04-01 296010条记录
2014-03-01 289087条记录
2014-02-01 288831条记录
2014-01-01 288661条记录
2013-12-01 287379条记录
2013-11-01 286438条记录
2013-10-01 286418条记录
2013-09-01 284304条记录
2013-08-01 282136条记录
2013-07-01 281965条记录
2013-06-03 281413条记录
2013-05-03 281071条记录
2013-04-01 279680条记录
2013-03-01 276893条记录
2013-02-01 275967条记录
2013-01-01 274995条记录
2012-12-01 274832条记录
…………

 

 

Excel vlookup  函数  xls 使用

 归属地公式:=(VLOOKUP(LEFT(B2,7),号段数据库!B:D,2,0)&VLOOKUP(LEFT(B2,7),号段数据库!B:D,3,0))

 运营商公式:=(VLOOKUP(LEFT(A2,3),isp!A:B,2,0))
 运营商公式:=(VLOOKUP(LEFT(B2,7),号段数据库!B:E,4,0))

 两个列合并:=CONCATENATE(B1&C1)

 

 

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

 


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

相关文章

手机号码归属地数据库下载

一份手机号归属地数据&#xff0c;共有174495条数据&#xff0c;包括中国移动&#xff0c;中国联通&#xff0c;中国电信的&#xff08;包含152、186、188、189开头的手机号&#xff09;。其中cardtype字段基本上没有什么用。因为可以通过办理某些业务就可以把如全球通卡转成神…

手机号段归属地数据库

最新手机号段 归属地数据库 每月更新一次 1、提供三大运营商及虚拟运营商的号段数据库&#xff0c;共340054条数据&#xff0c;最后更新时间&#xff1a;2016-04-20 2、字段&#xff1a;号段前缀、号段、邮编、区号、省、市、运营商、卡类型 3、号段包括 1&#xff09;移…

调用手机在线API获取手机号码归属地信息

手机在线&#xff08;www.showji.com&#xff09;始创于2001年&#xff0c;发展至今已拥有国内最准确、号段容量最大的手机号码归属地数据库系统&#xff0c; 目前号段容量将近33万条&#xff0c;每月保持两次以上规模数据更新&#xff0c;合作伙伴包括&#xff1a;百度、淘宝、…

最新手机号码归属地数据库(2017年4月1日)

2017年4月1日版 近36万条记录 celldb.cc最新 号码归属地数据库 手机号段数据库 移动 联通 电信 移动号段 联通号段 电信号段 虚拟170号段 171号段号码字段包括 省市 运营商 邮编 区号 等信息 移动号码&#xff1a; 134 135 136 137 138 139 147 150 151 152 157 158 159 178 …

PHP——最新号码归属地数据库

前言 最近在忙的一个项目&#xff0c;为了数据安全&#xff0c;不能够使用任何第三方的接口~ 号码库 | https://github.com/wangyang0210/Phone-Number-Range 代码 其实就是一个很简单的封装方法&#xff0c;没什么好说的~ /*** 根据号码返回归属地* * param string $phone 手机…

APISpace 手机号码归属地和运营商查询API

APISpace 的 中国手机号码归属地和运营商查询API&#xff0c;为您提供最新的中国移动、中国电信、中国联通所有手机号码归属地等功能&#xff0c; 输入手机号码至少前7位&#xff0c;可查该手机号码归属地、所属号段、手机卡类型。 手机号码归属地有三大作用&#xff1a; 代表…

APISpace 手机号码归属地API

今天就和大家讲一讲 APISpace 的 手机号码归属地API&#xff0c;可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段&#xff0c;更新及时、准确度高。 接口优势 准确性高&#xff1a; 动态数据库&#xff0c;囊括最新的1…

2023最新手机归属地数据库mysql,近49w条数据

最新手机号段归属地数据库 最新 手机号段数据库 号码归属地数据库 移动号段 联通号段 电信号段 广电号段 虚拟运营商 字段有 省份 城市 运营商 区号 邮编&#xff0c;对于数据分析、号码归属地查询等非常有帮助 各号段最新数据量 SELECT * FROM mobile WHERE phone1518888 查询…

mysql手机号段地区库_最新全国手机号段归属地数据库下载(mysql+xlsx+txt格式)46万条...

在做网站程序时,经常用到校验用户输入的手机号归属地或所属移动,电信,联通等服务商,本手机号码段归属地数据库包括支持可查省份 城市 运营商 邮编 区号。而且提供.mysql,excel,txt三种数据格式数据库,2020年11月份最新的包括46万条记录集,可方便为实现手机号码段归属地查…

手机号归属地数据库;根据手机号查找对应的归属地;

我在网上找到了一份手机号对应归属地的数据库文档。 链接: https://pan.baidu.com/s/1MQtDkw3sowNmdSeoVJUbEA 密码: tp1o 链接: https://pan.baidu.com/s/1pzh_FqXOP_6Ta103K5Cmyw 密码: 9j5r 如有需要&#xff0c;先点赞、关注&#xff0c;再下载。

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

最新手机号段归属地数据库(2021年4月发行版) 473101行基于&#xff1a;最新手机号段归属地数据库 名称&#xff1a;手机号码归属地查询 dat高效率查询 压缩&#xff1a;原版txt为25M,生成这种dat结构为2.86M 性能&#xff1a;每秒解析300w ,简洁高效 创建&#xff1a;qqzeng-i…

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;然后只需要在需要用到这些变…