UP | HOME

移动台国际用户识别码

目录

1 前言

作为今年的最后一篇博客,本来是准备写 Dijkstra 单源最短路径算法 的,但是计划赶不上变化,只能留在明年了。

为了不让最后一篇博客泡汤,还是决定写一篇简单的、短的博客 - 关于移动台国际用户识别码。

也就是常说的 手机号码.

2 起因

移动台国际用户识别码这个东西应该是通信工程要学的东西,和我是没啥关系的。

然而,由于这学期连续的外卖生涯,让我想到了一个问题:

  • 为啥取外卖的时候只需要手机号码的 后四位 就够了呢?

这是一个很严肃的问题,难道就不担心重复的问题吗?

然后就去网上查了一下相关的资料,发现,这样做是没有问题的,或者说,发生问题的可能性很低很低!

3 MSISDN

MSISDN 就是移动台国际用户识别码的缩写,和身份证号码一样,它可以通过号码中不同的区段来区分你所在的国家、地区,同时也可以标识该号码的服务提供商以及你的用户代码。

MSISDN 的基本结构划分如下:

MSISDN = CC + NDC + SN

各部分的含义如下:

名称 含义 例子
CC 国家代码,用于标识该号码所在国家,拨打国内号码时可以省略 中国 +86
NDC 国家目的地代码,用于标识该号码所在地
SN 用户号码,用于标识用户

其中, CC 是由国际上统一决定的,通常为 1-3 位,而 NDCSN 就由各个国家自己制定了。

其他国家怎么制定的我不了解,了解了也没有用,因此简单了解一下国内的结构就行了。

4 国内号码结构

现在国内的手机号码通常为 11 位(省略国家代码),其中 NDC7 位,由 MACHLR 组成,剩下的就是 4 位的 SN 了。

MAC移动接入码, 通常为 3 位数字,比如 133、176、183 这些。

HLR 标识了该号码的 归属地, 由 运营商 统一分配,通常为 4 位数字。

最后的 4 为数字代表的就是 用户号码 了,在同一 MACHLR 是不会重复的。

这里也就说明了为什么取外卖只需要手机号码后四位了,因为同一个区域下的 SN 基本是不可能重复的。

5 正则表达式

通过 Python, 我们可以简单的尝试匹配国内手机号码:

In [1]: import re

In [2]: pt = re.compile(r'(?P<MAC>\d{3})\s?(?P<HLR>\d{4})\s?(?P<SN>\d{4})')

In [3]: pt.match('133 3129 6636').groupdict()
Out[3]: {'HLR': '3129', 'MAC': '133', 'SN': '6636'}

emmmm, 结果的顺序似乎不是很完美……

6 结尾

博客中只是简单的介绍了国内号码的结果,而且还没有加上国家代码,实际使用中可能还要考虑跨区拨号的问题。

这些问题是博客里没有提及的,有兴趣的可以去了解一下。

7 参考链接

版权声明:本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可