1
renfei 4 天前
刚开始没想这么多呗。
已经出售的电话号没有检验位,如果加上校验位,之前的历史号码怎么办? |
2
drymonfidelia OP @renfei 从新号码开始实施
|
![]() |
3
ouqihang 4 天前 via Android
以前的机械电话怎么进行校验,也没有程控交换机。
|
4
PeakFish 4 天前 ![]() 请楼主解释一下 checksum ,我们才能继续指点电话系统设计者
|
![]() |
5
ouqihang 4 天前 via Android
7 位升 8 位的时候简单地在最前加一个固定的数字,还有些地方保留 7 位。
|
6
w568w 4 天前 ![]() 1. 电话号码输错没有什么损失,重新拨号就好了。不像身份证、银行卡,输错了真会有财产损失
2. 身份证纠错靠的不仅是纠错位,而是「姓名+纠错位」。仅靠纠错位无法纠正绝大部分输入错误 3. 现在熟人电话基本都用网络电话( VoIP 、微信、QQ 、会议)替代了,电话仅用于生人。一般人打电话的频率很低,没有必要专门实施新系统 |
![]() |
7
terence4444 4 天前 via iPhone
电话号码加校验位会浪费大量号码,而且似乎也没必要,打错电话的代价很小。
|
![]() |
8
rekulas 4 天前
加一位不止 50 吧 估计能降低 80-90
|
9
drymonfidelia OP |
![]() |
10
rekulas 4 天前 ![]() @drymonfidelia 加二进制理论上没问题,但是你的号码怎么让用户输入呢
例如你的号码 12345678 二进制 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 那你的校验位怎么加? 如果是 xor 后替换某一位,那就是减少了号码数量 得不偿失 如果是加一位,那用户如何输入?输入号码后再按一个 0/1 ?那为什么不直接加一个字节 0-9 ,验证还更强点 |
![]() |
12
cxh116 4 天前
非通话录的电话一概 AI 接
|
13
vvhy 4 天前
> @drymonfidelia 浪费不了多少
应该是浪费了 50% |
14
drymonfidelia OP @rekulas 把二进制转回十进制啊,相当于用掉 1/8 个数字校验
|
15
drymonfidelia OP @vvhy 浪费了其中八分之一个数字 那么多号码没分配,这算什么
|
![]() |
16
sivacohan 4 天前
1. 避免“接到”误拨电话,这个和降低哈希碰撞的概率问题类似。增加扩大输入空间,使得输入集和结果集都尽可能稀疏,就能解决这个问题。这个问题和“校验码”无关。
2. 校验码,校验码的用途是验证“数据”是否准确。场景是别人告诉你他的电话,你可以通过校验的方式,来立刻确定他在说谎,电话是错误的。 3. OP 主题中说的,如果最后一位是校验码。那么用户输入的时候就可以不输入,因为校验码不属于信息。还是不能避免误拨通 |
![]() |
17
huijiewei 3 天前 ![]() 你这样搞,炸弹号特殊号怎么弄啊
|
18
arielherself 3 天前 via iPhone
@sivacohan 没懂你的意思。OP 的意思是保证所有分配的电话号码二进制形式最后一位都等于前面位的异或,这样可以减小拨出错误号码的几率。什么叫“用户可以不输入”?
|
![]() |
19
joynvda 3 天前
所谓输错号码打错电话的,有多少概率是碰瓷,扫描号段?
对于那些 12345678 ,8888 等号码,如何加校验位?如果运营商能卖选号多赚点钱,干嘛要做无意义的事情? 最后,微信 ID 为何不加一个校验位? |
![]() |
20
pkoukk 3 天前
经常接到有人输错号码打错的电话
这个体验我还一次都没有过... |
![]() |
21
restkhz 3 天前 ![]() 或许你可以参考 Luhn 算法,身份证校验算法之类的,搞个 mod12 。
还有如果你能加一位号码(考虑到还有星号井号),能多携带\log_2 12 大概 3.6bits 的信息。所以你能做的远超过只是加一个奇偶校验 bit 。从信息论角度,理想情况下最好可以做到 100%-2^(3.6)%,就是多一 bit 能校验一半信息,大概 91.7%的查错率。 这大概是一个历史路径依赖的问题,一开始是和接线员说你找哪里的谁谁谁就好,后来开始用了自动交换机后才开始用号码。 我在博物馆看过那个巨大的貌似叫步进电话交换机的玩意儿,那个时代没有芯片。你拨一个数字,后面那个巨大的机器里面就咔嚓咔嚓地转。 仅仅只是打个电话自动接线就已经非常不容易了...要是让它搞个内存,存你拨的号然后再跑校验算法就太难为他了。 后来电话交换机也数字化了,能玩校验算法了。但是电话号码早就开始全球化了...这个时候就不好升级了。 或许我们对芯片的存在习以为常了 |
22
drymonfidelia OP @huijiewei 电话号码又不是什么比特币钱包需要离线可用,校验算法可以在运营商那边跑,特殊号特殊处理即可
|
23
drymonfidelia OP 另外校验位也不一定要在最后一位,可以在中间
|
24
moefishtang 3 天前
现在有接通后先转接到运营商的验证服务,输入指定密码后才能接通到对方手机上
用来防骚扰的,某种意义上也满足了 OP 对于电话号码加校验位的需求? |
![]() |
25
neptuno 3 天前 ![]() 感觉就是增加一位,但是又从中废弃了很大一部分号码,就是为了防止用户打错电话,是这个意思吗?
|
27
Donaldo 3 天前
@drymonfidelia #2 你咋知道哪个是新的哪个是旧的,那还校验不校验。。
|
![]() |
28
pirredelu 3 天前 ![]() 加一位也会增加用户输错的概率
|
29
1018ji 3 天前 ![]() V1 版本我们可以设计 1 位校验位,v2 版本为了校验这个校验位正不正常,我们再加 1 位,以此类推大事可成
|
30
Xopher 3 天前 via iPhone
难道打电话都是手输号码多?怕你加 100 位验证码都没用
|
![]() |
31
manhere 3 天前
想一下为啥叫电话号码,不叫电话编码?
|
![]() |
32
mazz 3 天前
|
![]() |
33
rekulas 3 天前 ![]() @drymonfidelia 感觉你可能不懂二进制 一个独立 bit 你怎么转 10 进制...
|
![]() |
34
ganbuliao 3 天前
虽然我比较菜 但是有没有可能是为了我这种菜鸟友好啊 比如我是运营商老板 要新增 1000 个号码 那我就很简单的知道新增了哪些号码 统计的时候也好统计 业务员也好统计也好分配统计啊 这就是 10 进制的优势
|
35
yanqiyu 3 天前
换个角度,这里加奇偶校验也就约等于编号码的时候跳着编
这么一听不就是很诡异了 |
36
shine1996 3 天前
没懂你的意思, 用户输入电话号码时多输入一个 0/1 吗?
那不还是会输错啊? |
![]() |
37
yolee599 3 天前 via Android
那运营商还怎么卖尾号为 888 ,666 的靓号?
|
38
peakmuma 3 天前
@drymonfidelia 应该 少了 1/2 吧
|
39
Keyi 3 天前 via Android
没必要啊,十几位的电话号记不住,加了一位,更记不住了
|
![]() |
40
yuhaofe 3 天前
那号码总数不也少了一半 😂
|
41
catazshadow 3 天前 via Android ![]() 因为打错了的电话也能收钱
|
![]() |
42
TORYOI 3 天前
1 年都不一定能接到打错电话的
|
![]() |
43
malusama 3 天前
然后各种 OS 内置优化的一个宣传点是手机号码只需要记实际位数, 校验位自动输入
|
44
hefish 3 天前 ![]() 又一个,我比专业的人更专业 系列 。。。。
|
45
fuzzsh 3 天前 via Android
想必 OP 看过历史战争的美剧,有拍摄过接线生的工作场景(其他剧可能也有出现,但本人见识浅薄)
电话近代化才出现程控式的交换,而且调度规则也很简单,沿用至今,只匹配前缀,例如 13800138000 ,匹配到 138 转发去中国移动总公司网关,总公司将 0013 转到当地分公司的网关,分公司网关的数据库才是记录最终用户的信息。 OP 提到新号码才实施,问题是旧号码怎么拨通?用户量上来后再迭代也要兼容老用户的,而且这个电话号码还是 primary key ,类比开发的时候,迭代会将 primary key 改来改去?除非是重建互不兼容的标准,IPv4/IPv6 就是例子 加了 checksum 还是有打错电话的,是不是还要加多 1 位去校验前 1 位 checksum (滑稽 |
![]() |
46
Pipecraft 3 天前
好想法。过去是能尽量短一点,就短一点。
现在就算多一位数字也没有太大问题。反正不会用脑子记了。 |
![]() |
48
Pipecraft 3 天前
现在:185-0123-4567
新号码: 185-0123-4-5678 假设中间 4 是校验码,也可以是其他位数。 4 = hash(185-0123--5678) 这个 hash 算法返回 0-9 ,最大程度减少号码浪费。 拨号时,任意一位输错,手机端都可以计算出来,提醒拨号的人。 只对新号码验证,旧号码保留原来的逻辑。 |
49
HongyuGao 3 天前
好问题,之前还真没考虑过这件事
|
![]() |
50
Pipecraft 3 天前
|
51
moudy 3 天前 ![]() 我觉得 l 这个 idea 很好。但是看完回复震惊了。这么一个简单且生活中到处都在用的玩意,竟然这么多人都理解不了。
|
53
lvxiang119 3 天前
虽然人们不愿意承认,但打错电脑是一种需求。
|
54
moudy 3 天前
@drymonfidelia #23 放在 133 186 这些局号里完全可行。局号的冗余空间非常大。
|
![]() |
56
james2013 3 天前 via Android ![]() 因为你这需求是伪需求,凭什么要为了这极小众的需求进行增加位数?
最近十年,我接到打错的电话不到 10 次…… 一般的人不小心输错手机号码的概率很小,除非这个人粗心大意或者年纪大不会用手机。 关键是手动输入手机号码拨打的场景少,大部分是通过通讯录或者通话记录拨打。 |
57
kneo 3 天前
为什么不给你的名字也加一个校验位呢,这样不会写错名字了。
|
58
PrinceofInj 3 天前 ![]() 不知道楼里为什么这么多大聪明在嘲讽,纯粹就是一个历史遗留问题,现在多少地方的固定电话第一位都是 8 的,更不用说手机号的第一位 1 了,事实上第一位根本没用。如果把第一位改成校验位是不是会好很多?当然你要说手机号的第一位是 1 是代表是手机拨号,牵涉到拨号程序那就没啥好说的了,还是上面的话,历史遗留问题。包袱太大,以至于无法实行。
|
59
James369 3 天前
没必要,已经有校验了:您拨打的电话是空号
|
60
ershierdu 3 天前
@PrinceofInj 我觉得 1 某种程度上算是个 magic number ,一看就知道是手机号。当然也可能是为了后续拓展到 2 留的……
是一个挺有意思的问题,也许可以要求 sum(nums[:10]) % k == nums[10] % k ,这样会使(k-1)/k 的号码被废弃 假设打错电话通常是按错一个数字,那 k=2 也够用了 |
![]() |
61
MoYi123 3 天前
这么多人觉得一定要多加一位数的?
那是不是也理解不了为什么 90000 和 60000 都是 5 位数, 为什么一个能用 int16 表示, 一个不能? |
![]() |
62
vfxx 3 天前 ![]() 作为曾经的运营商工作人员,我只能说,这种事是违背运营商利益的,1 影响卖吉祥号 2 影响收入 3 增加设计复杂难度 4 增加运营成本和管理成本
你打错电话,运营商是赚钱的,本来收 1 份,打错了可以收 2 份。 现在谈论固话没意义了,手机号中间四位是区号,如果再增加一位校验码,号码资源就更少了,势必影响收入 出力不讨好的事情谁干? |
63
billccn 3 天前 ![]() @restkhz
> 要是让它搞个内存,存你拨的号然后再跑校验算法就太难为他了。 你小看机械式交换机了,里面是有内存的(靠移动和检测机械装置的物理位置),也可以做出图灵机跑算法(毕竟图灵的时代根本没有集成电路)。 一般自动交换机管你拨号和接通是两个机器(可以看成分别的程序),第一个机器先分析你是打本地还是其他局,如果是其他局你后面拨的号码就会缓存在本地,同时它去找一个空闲的中继线,中继通了以后它会把整个号码一股脑地拨出去。 |
64
mayli 3 天前
大部分人类交互的号码都没有校验位,比如电话 车牌 qq 邮箱 美国 ssn 网站域名
加入校验位的目前常用的只有身份证号码,也是历史遗留问题,毕竟信息时代姓名+身份证号码验证并不难,但是信息化之前 ,由于户籍系统的复杂性,这玩意弄错了,会给公仆和人民造成麻烦。 实际上这玩意不是啥好的设计,比如号码里面带个 X, 号码里带了生日和性别,导致巨长。 |
65
tozp 3 天前 ![]() 这就是工程师思维了,
只想着解决一个问题是不够的 |
66
vvhy 3 天前
@drymonfidelia #15 新增的 bit 本来可以用来分配给同样多的人,那不就是 50%吗
|
![]() |
67
ZE3kr 3 天前 via iPhone
那你家地址也可以加一位,邮编也加一位,单元号、门牌号也都可以加一位。都可以降低输入错误的概率。不加是为了更短呗,SSN 都没有额外的校验位
|
68
si 3 天前
全部号码升级的难度太大,如果旧号码也执行,那差不多要剔除一半号码。
如果只对新出的有效,目前号码已经基本够用,感觉没有出新号段的必要了,能分配的号段也不多了。 面对绝大部分都是旧号码,这个功能的作用太小了。 如果单独加一位数字,那手机肯定会有自动计算校验码的功能,这又起不到作用了。 我用了多年的移动和电信号码好像没有遇到打错过,有个前两年办的联通号码倒是遇到过几次,不知道是因为以前别人用过的旧号码还是真的打错了。 我很好奇有多少人经常遇到打错电话的,是靓号吗。 |
69
hxy100 3 天前
四个字,没这必要
|
![]() |
70
tyx1703 3 天前 via iPhone
号码最后设计一位助词位,用来检测前 11 位是否输入错误,可选输入
如果输入 11 位,当普通号码处理 如果输入 12 位,启用校验。 |
71
issues 3 天前 via iPhone
11 个数字全输入错 算下概率多大
|
72
crackidz 3 天前
大哥你有没有想过错了能怎么样....为了这个很无所谓的功能减少了 9/10 的空间合适吗...
|
73
issues 3 天前 via iPhone
从产品方面来讲,打错号码是客户的使用问题,还能增加收益,加入这个功能还增加成本. 这种吃力不讨好的 你觉得会做么
|
![]() |
74
wangtian2020 3 天前
打错电话是什么很严重的事情吗
|
![]() |
75
vfxx 3 天前
!!! 假如,真的要执行起来
1 )校验计算是放在终端设备还是运营商基站? 如果都放在本地设备校验,大小厂商的设备怎么适配,出了新号段是否要升级更新规则?智能设备还好,固定电话、功能机怎么增加校验? 2 )如果放在基站校验,问题是本来打错号是空号就有空号返回提示,号段不完整也会返回空号,如果打的号码符合校验规则且有人使用就会接通。 这样做还是解决不了根本问题,只是降低了打错电话概率,打错电话运营商照样收费,他何必自寻烦恼? 所以,即使这确实能提升用户小概率的体验,我仍然感觉这是个极小众需求,没有可行性。 |
76
dpx 3 天前
想法很好,但作为程序员,别人的屎山你愿意领头踩还是继续运行?
|
![]() |
77
xuanbg 3 天前 ![]() 我很少接到打错的电话,而我自己从来没有打错过电话。
直接拨号的话,号码增加 1 位增加了号码记忆难度,反而提升了拨错号的可能性。如果是电话簿拨号则不会有拨错号的可能。 这主意简直就是本世纪最臭的馊主意 |
78
shaozelin030405 3 天前
打错了重打。成本比你的方案低
|
79
krixaar 3 天前 ![]() @moudy #51 OP 认为自己接到的打错电话:不小心按错了一位拨到别人手机的情况频繁发生,大多数人不用通讯录,不用微信语音,都是拨号打电话的。实际上生活中的打错电话:你的手机号是二次放号的,别人打的自己存的号码。OP 用高成本(扔掉 90%的可用号码,因为校验位必然是唯一的)解决了最不经常发生的情况,对第二种情况无能为力,你还觉得是个好 idea 。
|
![]() |
80
cmdOptionKana 3 天前
根本没必要,打错就打错了,小概率,极小损失。
针对一个小概率且极小损失的问题做任何设计都是亏本的! 而且现在什么年代了,电话号码输入了打一下验证正确,就再也不会手动输入号码了。 |
81
willli 3 天前
分析一下这个改动能让运营商多赚多少钱?
什么?还要赔钱?滚 |
82
fuwenpei 3 天前
因为拨错号而接到电话,我这过往 20 年就出现过 2 次。一次是把 9396 拨成 9296 ,一次是 9396 拨成 9395 。
|
83
mkt 3 天前
客户说我要 88888 尾号的 要多少钱?低消多少?
客服:不好意思只有 88887 尾号 |
84
strobber16 3 天前 via Android
不是,v2 用户还看不清这事的数学本质吗?通过一种算法分配电话号码,使得有效号码在地址空间里尽可能的稀疏,而不是聚集在连续的号段。这里不需要拨号者或者转接设备做任何的计算,计算只发生在分配侧。
所以不这么做的原因很简单,增加分配难度。需要事先把一个号段所有的有效号码先算出来,然后下级分发单位(运营商,地区)才能拿着表去分配。然后就是历史路径依赖,以前没这么搞,你现在要改变整个发号流程不现实 |
![]() |
85
LieEar 3 天前
这不是一个技术问题,是运营商不愿意的问题。
你只要打电话就要收费,他们不管你电话有没有输错 |
86
kevinxzhao 3 天前
代价可能比较高。
|
87
gaifanking 3 天前
楼主应该是指手输号码的场景,从通讯录里拨号自然没有必要加校验位。
比如 11 位手机号输入完,再加 1 位校验位。这个很明显能避免 90%的错误,是有价值的。 但是这个校验算法,如果是拨号者心算,那一般人算不了。如果是通过软件计算,你在软件里输入的前 11 位输错了怎么办? 是个鸡生蛋蛋生鸡的问题。 |
88
z4go 3 天前
论起来感觉都没错,就是理论跟实际的差距,就算按这套理论落地往往会有偏差
|
89
HENQIGUAI 3 天前
首先误拨没那么多,然后误拨什么后果也不会造成,不如想想怎么解决骚扰电话问题。毕竟无论你校不校验,垃圾电话可从来不会误拨.....
|
91
pan20060802 3 天前 ![]() 感觉不如 上古笑话, 喜马拉雅山安装电梯,长城贴瓷砖。
|
![]() |
93
rainbowhu 3 天前
相比误拨,我更关注怎么解决骚扰电话。电话号码这种场景,校验位收益不大,可有可无。
|
![]() |
94
b821025551b 3 天前 ![]() @gg2018 拨号程序可不判断你的位数,猜猜手机号为什么从 13 开始;假如你设计个手机号是 110xxxxxxxx ,猜猜会打到哪里;或者你这个例子,11 位的手机号是 13111111111 ,12 位的手机号校验完了是 131111111112 ,那么这个 12 位的号码永远不会被接通。
|
95
fun201108 3 天前
电话号码是从前往后识别的,你可以试一下 1234567890 ,100001111111 ,也都能拨通
|
![]() |
96
Goooooos 3 天前
你加了校验位,然后转回十进制,然后人工输入,该输错还是会输错,可能有概率输错的号码拨打过去是空号。
|
![]() |
97
hailaz 3 天前
就问一个问题,加了校验码能不能避免输错,输错了是不是还得重新输入,实际并没有减少输入的次数。
单纯校验没有纠错并不会降低出错的概率。 有一个已经比较完善的体系,叫二维码,但一般人记不住。 |
![]() |
98
itskingname 3 天前
@drymonfidelia 我国现在已经有超过 6 亿个手机号了,并且手机号是循环使用了,之前的人停机 3 个月就会回收号码转给下一个人。如果不考虑老号,只考虑新号,实际上每个月新增的新手机号很少。并且由于手机号并不是按数字递增发布的,所以你无法判断一个号是新号还是老号。可能你的新号最后一位校验位,输错了以后刚好是一个十年前的老号。
|
99
abc1310054026 3 天前
为什么我从来没有接到打错的电话,是只有我这样吗?
|
100
KingHL 3 天前
不明白,电话号码编号没有规律,如何进行校验,我输入号码的时候,输错一个数字也是有对应机主的,你怎么知道我想打给哪位?
|