手机号码归属地 mysql_最新手机号段归属地数据库 (2021年1月版) 471402行

手机号码归属地 mysql_最新手机号段归属地数据库 (2021年1月版) 471402行//名称:手机号码归属地查询dat高效率查询内存优化版//压缩:原版txt为22M,生成这种dat结构为2.66M//性能:每秒解析300万+号段或者号码,简洁高效//环境:CPUi7-7700K+内存16GB//创建:qqzeng-ipusingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Text;…

大家好,又见面了,我是你们的朋友全栈君。

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

usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Text;usingSystem.Threading;namespaceqqzeng_phone_dat

{public classPhoneSearchFast

{private static readonly Lazy lazy = new Lazy(() => newPhoneSearchFast());public static PhoneSearchFast Instance { get { returnlazy.Value; } }privatePhoneSearchFast()

{

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-199

private long[,] phonemap;private byte[] data;private long[] phoneArr;private string[] addrArr;private string[] ispArr;///

///初始化二进制dat数据///

///

///

private voidLoadDat()

{

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

{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 voidWatch()

{

FileInfo fi= newFileInfo(datPath);

FileSystemWatcher watcher= newFileSystemWatcher(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;

}///

///号段查询///

/// 7位或者11位

///

public string Query(stringphone)

{longpref;long val = PhoneToInt(phone, outpref);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 “”;

}

}///

///二分算法///

private int BinarySearch(long low, long high, longkey)

{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);else

return BinarySearch(mid + 1, high, key);

}

}private long PhoneToInt(string phone, out longprefix)

{//最高性能

charch;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;returncurrentValue;

}//prefix = Convert.ToUInt32(phone.Substring(0,3));//return Convert.ToUInt32(phone.Substring(0, 7)); ;

}///

///字节转整形 小节序///

private uint BytesToLong(byte a, byte b, byte c, byted)

{return (uint)(a | (b << 8) | (c << 16) | (d << 24));

}

}/*(调用例子):

string result = PhoneSearchFast.Instance.Query(“号段|号码”);

–> result=”省份|城市|区号|邮编|行政区划代码|运营商”*/}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163141.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月22日 下午12:36
下一篇 2022年7月22日 下午12:36


相关推荐

  • AlphaBlend 详解

    AlphaBlend 详解AlphaBlend nbsp nbsp 该函数显示拥有透明或半透明像素的位图 nbsp SyntaxBOOL nbsp AlphaBlend nbsp nbsp nbsp HDC nbsp nbsp hdcDest nbsp nbsp nbsp nbsp int nbsp nbsp nbsp nbsp nXOriginDest nbsp int nbsp nbsp nbsp nYOriginDest nbsp int nbsp nbsp nbsp nWidthDest nbsp int nbsp nbsp nbsp nHeightDest nbsp nbsp nbsp nbsp HDC nbsp nbsp nbsp hdcSrc nbsp nbsp nbsp

    2026年3月20日
    2
  • OpenClaw新手教程(详细图文),小龙虾养虾指南

    OpenClaw新手教程(详细图文),小龙虾养虾指南

    2026年3月13日
    2
  • 腾讯游戏扫码登录小程序

    腾讯游戏扫码登录小程序腾讯游戏扫码登录用途说明比如你想登录朋友的游戏账号 那么你就可以用得上这个了 所谓的扫码登录就是不需要朋友的账号密码 也能登录朋友的游戏账号 只要你把对应的游戏登录二维码发送给你的朋友 通过微信扫一扫就能登录了 游戏代练的老哥们必备神器 点这里进入腾讯游戏扫码登录网站 https www vmuyu cn 网站必须要在微信中打开 否则无效 体验小程序请扫码小程序截图

    2026年3月19日
    2
  • 浅谈CAS原理_cas算法原理

    浅谈CAS原理_cas算法原理1.背景我们知道,synchronized就是一种独占锁,独占锁是一个悲观锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一种更加有效的锁就是乐观锁,CAS就是一种乐观锁2.CAS原理CAS(CompareAndSwap),比较并交换。我们知道,如果我要对一个变量进行操作,可以分为三个步骤读取该变量的值进行一系列的运算得到新的结果将运算的结果保存这儿需要知道CAS中有三个概念:内存地址的值V,旧值(从内存地址读取到的值)A,新值(进行操作后的结果值)。对应上面三

    2022年10月9日
    4
  • TreeMap详解

    TreeMap详解一 概念及概述 TreeMap 是一个有序的 key value 集合 非同步 基于红黑树 Red Blacktree 实现 每个 key value 作为红黑树的一个节点 TreeMap 存储时会进行排序的 会根据 key 来对 key value 键值对进行排序 其中排序方式也是分为两种 一种是默认排序 按 key 的升序 一种是定制排序 具体取决于使用的构造方法 二 插入插入操作比较复杂一

    2026年3月17日
    2
  • 萌新发问:MyBatis日志到底是如何做到兼容所有常用日志框架的?

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:双子孤狼 blog.csdn.net/zwx900102/article/details/109025846 …

    2021年6月26日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号