最新⼿机号段归属地数据库(2022年3⽉版)483085⾏
最新⼿机号段归属地数据库
简单介绍
最新⼿机号段归属地数据库(2022年3⽉发⾏版)483085⾏
基于:
名称:⼿机号码归属地查询dat⾼效率查询
压缩:原版txt为25M,⽣成这种dat结构为1.8M
性能:每秒解析1000w+,简洁⾼效
创建:qqzeng-ip
号段分配
公众移动通信⽹⽹号分配情况
号段划分
开发参考
⼿机归属地查询c#javaphp解析dat内存优化版
快速内存数据库Redis版以及导⼊数据库mysqlmssql脚本
查询演⽰
微信⼩程序
最新⼿机号段数据库号码归属地数据库移动号段联通号段电信号段虚拟运营商
权威全⾯准确规范
字段包括省份城市运营商邮编区号等信息,对于数据分析、号码归属地查询等⾮常有帮助
更新历史
2022-03-01483085条记录xlsx+txt+csv+mysql+mssql
2022-02-01481615条记录
2022-01-01481399条记录
2021-12-01479711条记录
2021-11-01478420条记录
2021-10-01476737条记录
2021-09-01475442条记录
2021-08-01474888条记录
2021-07-01474468条记录
2021-06-01473721条记录
2021-05-01473691条记录
2021-04-01473267条记录
2021-03-01472529条记录
2021-02-01472019条记录
2021-01-01471402条记录
2020-12-01465883条记录
2020-11-01464737条记录
2020-10-01463471条记录
2020-09-01459519条记录
2020-08-15458461条记录
2020-08-01458084条记录
2020-07-15458020条记录
2020-07-01457441条记录
2020-06-15455731条记录
2020-06-01454802条记录
2020-05-01450433条记录
2020-04-01450175条记录
2020-03-01447897条记录
2020-01-01442612条记录
2019-12-01441831条记录
2019-11-01439265条记录
2019-10-01439025条记录
2019-09-01438615条记录
2019-08-01437124条记录
2019-07-01436804条记录
2019-06-01430826条记录
2019-05-01429052条记录
2019-04-01424014条记录
2019-03-01423850条记录
2019-02-01423766条记录
2019-01-01421973条记录
2018-12-01415967条记录
2018-11-01415806条记录
2018-10-01415311条记录
2018-09-01413015条记录
2018-08-01411856条记录
2018-07-01410765条记录
2018-06-01405385条记录
2018-05-01398209条记录
2018-04-01387892条记录
2018-03-01382140条记录
…………
2017-07-01363952条记录
2017-06-01362386条记录
2017-05-01359938条记录
…………
2013-04-01279680条记录
2013-03-01276893条记录
2013-02-01275967条记录
2013-01-01274995条记录
2012-12-01274832条记录
…………
号段划分
移动号段:
7887188195198
联通号段:
66185186196
电信号段:
33199
虚拟运营商:
0171
字段样例
号段归属地格式详解
超⾼性能
编码:UTF8字节序:Little-Endian
返回多个字段信息(如:⼴东|深圳|518000|0755|440300|移动)
------------------------⽂件结构---------------------------
//⽂件头20字节4-4-4-4-4
[前缀数量][号段数量][内容区长度][运营商区长度][版本:20211201]
//内容区长度⽆限制
[地区信息][地区信息]……唯⼀不重复
//运营商区长度⽆限制
[运营商][运营商]……唯⼀不重复
//前缀区7字节(1-4-2)
[号段前三位][索引区start索引][索引区个数]
//索引区4字节(2-2)
[号段后四位][地区索引+运营商索引(不⾜补0)]
------------------------⽂件结构---------------------------
优势:压缩形式将数据存储在内存中,通过减少将相同数据读取到内存的次数来减少I/O.
较⾼的压缩率通过使⽤更⼩的内存中空间提⾼查询性能。
解析出来⼀次性加载到⼆维数组中,查询性能提⾼1倍!
压缩:原版txt为23M,⽣成dat结构为1.8M,上⼀版为3.2M
性能:每秒解析1000w+
对⽐:相⽐其他dat更简洁更⾼效
创建:qqzeng-phone于2021-12-12
3.0和2.0性能⽐较
新版3.0内存版:
查询1500万->1.531秒每秒979.75万次
查询914万->0.821秒每秒1113.2764920828258万次
查询1424万->1.375秒每秒1035.6363636363637万次
查询584万->0.516秒每秒1131.7829457364342万次
查询1468万->1.29秒每秒1137.984496124031万次
查询1216万->1.061秒每秒1146.4万次
查询754万->0.673秒每秒1120.3566121842496万次
查询988万->0.871秒每秒1134.3283582089553万次
查询1534万->1.33秒每秒1153.3834586466164万次
查询832万->0.797秒每秒1043.9万次
查询1340万->1.185秒每秒1130.8万次
查询924万->0.807秒每秒1144.981412639405万次
查询848万->0.741秒每秒1144.399460188934万次
查询1526万->1.331秒每秒1146.5万次
查询808万->0.698秒每秒1157.593123209169万次
查询594万->0.522秒每秒1137.931万次
旧版2.0内存版:
查询1398万->2.932秒每秒476.84万次
查询1558万->3.037秒每秒513.8万次
查询822万->1.586秒每秒518.2849936948297万次
查询576万->1.112秒每秒517.9856115107913万次
查询452万->0.926秒每秒488.12万次
查询1204万->2.499秒每秒481.7927170868347万次
查询340万->0.713秒每秒476.8583450210379万次
查询352万->0.716秒每秒491.62万次
查询948万->1.822秒每秒520.3万次
查询514万->0.987秒每秒520.77万次
查询928万->1.783秒每秒520.47万次
查询1598万->3.108秒每秒514.157万次
查询446万->0.862秒每秒517.4万次
查询466万->0.896秒每秒520.7万次
查询1024万->1.964秒每秒521.3849287169043万次
查询1550万->2.974秒每秒521.65万次
开发代码
internalclassPhoneSearchBest
{
privatestaticreadonlyLazy
publicstaticPhoneSearchBestInstance{get{;}}
privatePhoneSearchBest()
{
LoadDat();
}
privatebyte[]data;
privatelong[,]phone2D;
privatestring[]addrArr;
privatestring[]ispArr;
///
///初始化⼆进制dat数据
///
///
///
privatevoidLoadDat()
{
vardatPath=e(rectory,@"");
data=lBytes(datPath);
varPrefSize=32(data,0);
vardescLength=32(data,8);
varispLength=32(data,12);
varPhoneSize=32(data,4);
varverNum=32(data,16);
varheadLength=20;
intstartIndex=(int)(headLength+descLength+ispLength);
//内容数组
stringdescString=ing(data,headLength,(int)descLength);
addrArr=('&');
//运营商数组
stringispString=ing(data,headLength+(int)descLength,(int)ispLength);
ispArr=('&');
phone2D=newlong[200,10000];
for(varm=0;m
{
inti=m*7+startIndex;
intpref=data[i];
intindex=(int)32(data,i+1);
intlength=16(data,i+5);
for(intn=0;n
{
intp=(int)(startIndex+PrefSize*7+(n+index)*4);
varsuff=16(data,p);
varaddrispIndex=16(data,p+2);
phone2D[pref,suff]=addrispIndex;
}
}
}
publicstringQuery(stringphone)
{
varprefix=32(ing(0,3));//前缀
varsuffix=32(ing(3,4));//后缀
varaddrispIndex=phone2D[prefix,suffix];
if(addrispIndex==0)
{
return"";
}
returnaddrArr[addrispIndex/100]+"|"+ispArr[addrispIndex%100];
}
}
/*
(调⽤例⼦):
stringresult=("号段|号码");
-->result="省份|城市|区号|邮编|⾏政区划代码|运营商"
*/
1//名称:⼿机号码归属地查询dat⾼效率查询内存优化版
2//压缩:原版txt为22M,⽣成这种dat结构为2.66M
3//性能:每秒解析300万+号段或者号码,简洁⾼效
4//环境:CPUi7-7700K+内存16GB
5//创建:qqzeng-ip
6
7
8usingSystem;
c;
;
;
ing;
13
14namespaceqqzeng_phone_dat
15{
16
17publicclassPhoneSearchFast
18{
19privatestaticreadonlyLazy
20publicstaticPhoneSearchFastInstance{get{;}}
21privatePhoneSearchFast()
22{
23LoadDat();
24Watch();
25}
26
27privatestringdatPath=e(rectory,@"");
28privateDateTimelastRead=ue;
29privatelong[,]prefmap=newlong[200,2];//000-199
30
31
32privatelong[,]phonemap;
33
34privatebyte[]data;
35
36privatelong[]phoneArr;
37privatestring[]addrArr;
38privatestring[]ispArr;
39
40///
41///初始化⼆进制dat数据
42///
43///
44///
45
46
47privatevoidLoadDat()
48{
49data=lBytes(datPath);
50
51longPrefSize=BytesToLong(data[0],data[1],data[2],data[3]);
52longRecordSize=BytesToLong(data[4],data[5],data[6],data[7]);
53
54longdescLength=BytesToLong(data[8],data[9],data[10],data[11]);
55longispLength=BytesToLong(data[12],data[13],data[14],data[15]);
56
57//内容数组
58intdescOfft=(int)(16+PrefSize*9+RecordSize*7);
59stringdescString=ing(data,descOfft,(int)descLength);
60addrArr=('&');
61
62//运营商数组
63intispOfft=(int)(16+PrefSize*9+RecordSize*7+descLength);
64stringispString=ing(data,ispOfft,(int)ispLength);
65ispArr=('&');
66
67
68
69//前缀区
70intm=0;
71for(vark=0;k
72{
73inti=k*9+16;
74intn=data[i];
75prefmap[n,0]=BytesToLong(data[i+1],data[i+2],data[i+3],data[i+4]);
76prefmap[n,1]=BytesToLong(data[i+5],data[i+6],data[i+7],data[i+8]);
77if(m
78{
79for(;m
80{
81prefmap[m,0]=0;prefmap[m,1]=0;
82}
83m++;
84}
85el
86{
87m++;
88}
89}
90
91//索引区
92phoneArr=newlong[RecordSize];
93phonemap=newlong[RecordSize,2];
94for(inti=0;i
95{
96longp=16+PrefSize*9+(i*7);
97phoneArr[i]=BytesToLong(data[p],data[1+p],data[2+p],data[3+p]);
98phonemap[i,0]=data[4+p]+((data[5+p])<<8);
99phonemap[i,1]=data[6+p];
100}
101
102
103
104}
105privatevoidWatch()
106{
107FileInfofi=newFileInfo(datPath);
108FileSystemWatcherwatcher=newFileSystemWatcher(oryName)
109{
110IncludeSubdirectories=fal,
111NotifyFilter=ite,
112Filter="",
113};
114
d+=(s,e)=>
116{
117
118varlastWriteTime=tWriteTime(datPath);
119
120if(lastWriteTime>lastRead)
121{
122//延时解决正由另⼀进程使⽤,因此该进程⽆法访问此⽂件
(1000);
124
125LoadDat();
126lastRead=lastWriteTime;
127}
128};
RaisingEvents=true;
130}
131
132
133
134
135///
136///号段查询
137///
138///
139///
140publicstringQuery(stringphone)
141{
142longpref;
143longval=PhoneToInt(phone,outpref);
144longlow=prefmap[pref,0],high=prefmap[pref,1];
145if(high==0)
146{
147return"";
148}
149longcur=low==high?low:BinarySearch(low,high,val);
150if(cur!=-1)
151{
152
153returnaddrArr[phonemap[cur,0]]+"|"+ispArr[phonemap[cur,1]];
154}
155el
156{
157return"";
158}
159
160
161
162
163
164
165}
166///
167///⼆分算法
168///
169privateintBinarySearch(longlow,longhigh,longkey)
170{
171if(low>high)
172return-1;
173el
174{
175longmid=(low+high)/2;
176longphoneNum=phoneArr[mid];
177if(phoneNum==key)
178return(int)mid;
179elif(phoneNum>key)
180returnBinarySearch(low,mid-1,key);
181el
182returnBinarySearch(mid+1,high,key);
183}
184}
185
186
187
188privatelongPhoneToInt(stringphone,outlongprefix)
189{
190//最⾼性能
191charch;
192longcurrentValue=0;
193longprefval=0;
194unsafe
195{
196fixed(char*name=phone)
197{
198for(intcurrent=0;current<7;current++)
199{
200ch=name[current];
201intdigitValue=ch-'0';
202currentValue=(currentValue*10)+digitValue;
203if(current==2)
204{
205prefval=currentValue;
206}
207}
208}
209prefix=prefval;
210returncurrentValue;
211}
212
213
214//prefix=32(ing(0,3));
215//32(ing(0,7));;
216}
217
218
219
220///
221///字节转整形⼩节序
222///
223privateuintBytesToLong(bytea,byteb,bytec,byted)
224{
225return(uint)(a|(b<<8)|(c<<16)|(d<<24));
226}
227
228
229
230}
231
232/*
233(调⽤例⼦):
234stringresult=("号段|号码");
235-->result="省份|城市|区号|邮编|⾏政区划代码|运营商"
236*/
237}
2.0内存版每秒500w+
usingSystem;
c;
;
;
namespaceqqzeng_phone_dat
{
publicclassPhoneSearch
{
privateDictionary
privatebyte[]indexBuffer;
privatebyte[]data;
longfirstPhoneOfft;//索引区第⼀条流位置
longlastPhoneOfft;//索引区最后⼀条流位置
longprefixStartOfft;//前缀区第⼀条的流位置
longprefixEndOfft;//前缀区最后⼀条的流位置
longphoneCount;//号段段数量
longprefixCount;//前缀数量
///
///初始化⼆进制dat数据
///
///
publicPhoneSearch(stringdataPath)
{
using(FileStreamfs=newFileStream(dataPath,,,))
{
data=newbyte[];
(data,0,);
}
firstPhoneOfft=BytesToLong(data[0],data[1],data[2],data[3]);
lastPhoneOfft=BytesToLong(data[4],data[5],data[6],data[7]);
prefixStartOfft=BytesToLong(data[8],data[9],data[10],data[11]);
prefixEndOfft=BytesToLong(data[12],data[13],data[14],data[15]);
phoneCount=(lastPhoneOfft-firstPhoneOfft)/8+1;//索引区块每组8字节
prefixCount=(prefixEndOfft-prefixStartOfft)/9+1;//前缀区块每组9字节
//初始化前缀对应索引区区间
indexBuffer=newbyte[prefixCount*9];
(data,prefixStartOfft,indexBuffer,0,prefixCount*9);
prefixDict=newDictionary
for(vark=0;k
{
inti=k*9;
uintprefix=(uint)indexBuffer[i];
longstart_index=BytesToLong(indexBuffer[i+1],indexBuffer[i+2],indexBuffer[i+3],indexBuffer[i+4]);
longend_index=BytesToLong(indexBuffer[i+5],indexBuffer[i+6],indexBuffer[i+7],indexBuffer[i+8]);
(prefix,newPrefixIndex(){prefix=prefix,start_index=start_index,end_index=end_index});
}
}
publicstaticuintPhoneToInt(stringphone,outuintprefix)
{
prefix=32(ing(0,3));
32(ing(0,7));;
}
///
///号段查询
///
///
///
publicstringQuery(stringphone)
{
uintphone_prefix_value;
uintintPhone=PhoneToInt(phone,outphone_prefix_value);
uinthigh=0;
uintlow=0;
uintlocal_offt=0;
uintlocal_length=0;
if(nsKey(phone_prefix_value))
{
low=(uint)prefixDict[phone_prefix_value].start_index;
high=(uint)prefixDict[phone_prefix_value].end_index;
}
el
{
return"";
}
uintmy_index=low==high?low:BinarySearch(low,high,intPhone);
GetIndex(my_index,outlocal_offt,outlocal_length);
returnGetLocal(local_offt,local_length);
}
///
///⼆分算法
///
publicuintBinarySearch(uintlow,uinthigh,uintk)
{
uintM=0;
while(low<=high)
{
uintmid=(low+high)/2;
uintphoneNum=GetIntPhone(mid);
if(phoneNum>=k)
{
M=mid;
if(mid==0)
{
break;//防⽌溢出
}
high=mid-1;
}
el
low=mid+1;
}
returnM;
}
///
///在索引区解析
///
///
///
///
///
///
privatevoidGetIndex(uintleft,outuintlocal_offt,outuintlocal_length)
{
longleft_offt=firstPhoneOfft+(left*8);
local_offt=(uint)data[4+left_offt]+(((uint)data[5+left_offt])<<8)+(((uint)data[6+left_offt])<<16);
local_length=(uint)data[7+left_offt];
}
///
///返回归属地信息
///
///
///
///
privatestringGetLocal(uintlocal_offt,uintlocal_length)
{
byte[]buf=newbyte[local_length];
(data,local_offt,buf,0,local_length);
ing(buf,0,(int)local_length);
//oding("GB2312").GetString(buf,0,(int)local_length);
}
privateuintGetIntPhone(uintleft)
{
longleft_offt=firstPhoneOfft+(left*8);
returnBytesToLong(data[0+left_offt],data[1+left_offt],data[2+left_offt],data[3+left_offt]);
}
///
///字节转整形⼩节序
///
privateuintBytesToLong(bytea,byteb,bytec,byted)
{
return((uint)a<<0)|((uint)b<<8)|((uint)c<<16)|((uint)d<<24);
}
}
/*
(调⽤例⼦):
PhoneSearchfinder=newPhoneSearch("");
stringresult=("号段或者号码");
-->result="省份|城市|运营商|区号|邮编|⾏政区划代码"
*/
}
普通版每秒200w+
本文发布于:2023-02-28 20:35:28,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/167758772885348.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:手机号段.doc
本文 PDF 下载地址:手机号段.pdf
留言与评论(共有 0 条评论) |