移动台国际用户识别码
1 前言
作为今年的最后一篇博客,本来是准备写 Dijkstra 单源最短路径算法 的,但是计划赶不上变化,只能留在明年了。
为了不让最后一篇博客泡汤,还是决定写一篇简单的、短的博客 - 关于移动台国际用户识别码。
也就是常说的 手机号码.
2 起因
移动台国际用户识别码这个东西应该是通信工程要学的东西,和我是没啥关系的。
然而,由于这学期连续的外卖生涯,让我想到了一个问题:
- 为啥取外卖的时候只需要手机号码的 后四位 就够了呢?
这是一个很严肃的问题,难道就不担心重复的问题吗?
然后就去网上查了一下相关的资料,发现,这样做是没有问题的,或者说,发生问题的可能性很低很低!
3 MSISDN
MSISDN
就是移动台国际用户识别码的缩写,和身份证号码一样,它可以通过号码中不同的区段来区分你所在的国家、地区,同时也可以标识该号码的服务提供商以及你的用户代码。
MSISDN
的基本结构划分如下:
MSISDN = CC + NDC + SN
各部分的含义如下:
名称 | 含义 | 例子 |
---|---|---|
CC |
国家代码,用于标识该号码所在国家,拨打国内号码时可以省略 | 中国 +86 |
NDC |
国家目的地代码,用于标识该号码所在地 | 略 |
SN |
用户号码,用于标识用户 | 略 |
其中, CC
是由国际上统一决定的,通常为 1-3
位,而 NDC
和 SN
就由各个国家自己制定了。
其他国家怎么制定的我不了解,了解了也没有用,因此简单了解一下国内的结构就行了。
4 国内号码结构
现在国内的手机号码通常为 11
位(省略国家代码),其中 NDC
占 7
位,由 MAC 和 HLR 组成,剩下的就是 4
位的 SN
了。
MAC 是 移动接入码, 通常为 3
位数字,比如 133、176、183 这些。
而 HLR 标识了该号码的 归属地, 由 运营商 统一分配,通常为 4
位数字。
最后的 4
为数字代表的就是 用户号码 了,在同一 MAC 和 HLR 是不会重复的。
这里也就说明了为什么取外卖只需要手机号码后四位了,因为同一个区域下的 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 结尾
博客中只是简单的介绍了国内号码的结果,而且还没有加上国家代码,实际使用中可能还要考虑跨区拨号的问题。
这些问题是博客里没有提及的,有兴趣的可以去了解一下。