V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
drymonfidelia
V2EX  ›  程序员

电话号码中为什么不加一位 checksum?经常接到有人输错号码打错的电话,哪怕只加 1bit 校验效果也能降低 50%概率

  •  5
     
  •   drymonfidelia · 159 天前 · 14804 次点击
    这是一个创建于 159 天前的主题,其中的信息可能已经有所发展或是发生改变。
    154 条回复    2025-05-06 12:13:23 +08:00
    1  2  
    loveour
        101
    loveour  
       158 天前
    咱们之前很多地方电话号码还是 7 位数,更早甚至更短,为什么一开始不设计成 8 位数?因为增加位数是真的要成本的。最早的长途电话是怎么拨通的?是人工转接。为什么后来叫程控电话?因为很晚才出现可以自动拨打长途的电话。电话本身由于管理需要,号码也不是无规律的,而是比如最前面是长途区号,中间有电话局的号段,最后才是个人号码。这个数字资源是很宝贵的,打错电话概率不高打错了成本也不高。现在的号码在升级的时候为了简单也尽量是原来的号码直接加一个固定数字。
    为了解决这个问题去浪费号段资源,去修改以前已经形成的大量号码,搞一个复杂没法记忆的规则加号码,这才是有问题的吧。
    cenbiq
        102
    cenbiq  
       158 天前
    @KingHL 看了你的和上面一些评论,我发现这个程序员论坛居然还有挺多人不知道 checksum 是什么,电话号码没有规律并不影响 checksum ,checksum 的作用是检查输入是否具有意义。比如说第一个为 1 第二个为 2 第三个为 3 ,那么最简单的 checksum 就是依次相加,得到第四位是 6 ,也就是说当你输入 1-2-3 的时候,第四位如果不是 6 就一定是个错误的电话号码,当然相加得出来可能>9 ,所以真实情况会用别的 checksum 算法,比如 CRC ,或者异或。
    evilwk
        103
    evilwk  
       158 天前
    为了一个小概率事件,没有任何意义,现在的手机有一项功能叫联系人
    Sentimental
        104
    Sentimental  
       158 天前
    问题的前提应该是输错的概率是多少
    F281M6Dh8DXpD1g2
        105
    F281M6Dh8DXpD1g2  
       158 天前
    楼主晚出生五十年
    shine1996
        106
    shine1996  
       158 天前
    @cenbiq ? 只是不理解这种方式 根本解决不了输错号码的问题
    littlewing
        107
    littlewing  
       158 天前
    @PeakFish 就像身份证好最后一位一样
    thevita
        108
    thevita  
       158 天前
    其实 更大可能是 reuse 了
    xkxwd
        109
    xkxwd  
       158 天前
    @tozp 是的…这么多年下来我现在觉得应该先解决我自己的认知问题😔
    nedqqcc
        110
    nedqqcc  
       158 天前
    说真的,还有人能接到正经电话吗?
    1. 快递+外卖+平台客服,这类看到的基本都是虚拟号,不存在打错的可能
    2. 家人,不说 60 后的父母辈,爷爷奶奶辈用微信打电话的都不少,毕竟“免费”
    3. 正规机构,政府,银行,保险等,这批人打错概率很低,频率也不高

    99.9%电话无非就是广告推销
    424778940
        111
    424778940  
       158 天前
    不是等一下 为什么有一种弱智吧老哥的感觉
    多加一位难道不用人记住吗? 能记住不还是有可能记错吗? 虽然能拦住一部分记错的人打出去 但解决不了根本问题
    zmcity
        112
    zmcity  
       158 天前   ❤️ 1
    电话号码是路由表,格式是(区号)-(移网/固网识别号)-(运营商编码)-(总机号)-(分机号),一位校验位恐怕不够呦
    KingHL
        113
    KingHL  
       158 天前
    @cenbiq 理解了,刚才昏头了
    swordspoet
        114
    swordspoet  
       158 天前
    这是一个很好的问题。
    msg7086
        115
    msg7086  
       158 天前
    所以,为什么域名和 IP 地址不加校验?
    v2ex.com0B20DC1D 多好呀,不怕输错域名了(狗头
    julyclyde
        116
    julyclyde  
       158 天前
    一位校验码扛不住的
    我见过银行卡号输错还能汇款成功的

    技术手段解决不了人傻的问题
    cherryas
        117
    cherryas  
       158 天前
    多加一位数记忆成本好几倍。
    参考验证码,4 位数不需要记,6 位数 1 秒 ,8 位数要 5 秒, 11 位和 12 位看似差一位,实际沟通成本增加 5 秒不过分吧。
    cenbiq
        118
    cenbiq  
       158 天前
    @shine1996 当然可以解决,我上面已经举例子了,如果是 3 位数字+1 位依次相加校验码,那么输入 1-2-3 之后必须输入 6 。以这个举例子,你把 123 想象为对方手机号前 len-1 位,最后一位为校验位,那么 1236 是唯一的 123 开头的手机号码的可能形式,输入 1235 或者 1246 一定判定为错误手机号。
    cenbiq
        119
    cenbiq  
       158 天前
    @nedqqcc 这倒是,因为手机电话发明出来之后马上进入移动互联时代,这导致手机号播错已经不是啥大问题了。现在联系方式多种多样,还有通讯录不需要人工输入手机号,唯一的作用就是在面对面添加对方手机号的时候能当场输入当场验证,不过这点也被直接播对面号码解决了。校验码的想法是对的,就像有人说的身份证就是这样,只不过时代变了这个需求没那么硬了。
    lambdaq
        120
    lambdaq  
       158 天前
    汽车为啥不加个火箭发动机,这样可以起步更快
    yh7gdiaYW
        121
    yh7gdiaYW  
       158 天前
    @cenbiq 你假定了打错号码是因为按错数字,这个前提就不完全正确
    sun019
        122
    sun019  
       158 天前
    需求确定,这个就是技术上实现没问题,但现实中扯蛋的伪需求。

    什么叫拨错,拨错的意思是没存在电话薄里面或者凭记忆输入的号码。
    就是这个号码没有一个电话本对应于你要拨给谁的,只是凭记忆。
    这个记忆,怎么映射拨错号码是否对呢?
    cenbiq
        123
    cenbiq  
       158 天前
    @yh7gdiaYW 大多时候都是按错数字,比如说银卡输入也是,银行卡号+名字。名字就相对于校验码,大多时候都在靠这个名字校验银行卡是否输入准确。
    greensea
        124
    greensea  
       158 天前
    其实我有一个不成熟的建议,与其加一个检验位,不如允许用户在现有号码基础上,任意添加一个 4 位尾数,这样可以有效打击号码倒卖。

    比如说我的号码是,13800138000 ,当我开启了这个功能点后,直接拨打这个号码是无法接通的,必须输入一个我设定的 4 位尾数(例如 1357 ),才能接通。我可以把 1380013800-1357 这个号码告诉熟人,这样他们可以通过电话联系到我。

    现在重点来了,我不仅可以指定 1357 这个尾数,我还可以指定任意尾数,于是:
    在淘宝留的快递电话:13800138000-1111
    去看房子时留的联系方式:13800138000-2345
    去 XXX 的时候留的联系方式:13800138000-9876

    当别人拨打这个号码的时候,局方的通话记录中会记录(并允许用户查询)这个尾号。好的,这下谁卖了我的号码可就一清二楚了。
    shine1996
        125
    shine1996  
       158 天前
    @cenbiq 是的, 我意思只解决了接到电话的人的问题, 不会被骚扰, 就像是访问输入网址网站一样,
    诶输错了,进入一个不认识的网站, 为什么会输入错误呢, 怎么解决输入错误的问题, 就是浏览器书签和电话本一样这是最佳的方案, 而不是增加用户输入成本不让你访问
    wysnxzm
        126
    wysnxzm  
       158 天前
    bro 是特工,也把别人当特工
    niubiman
        127
    niubiman  
       158 天前
    和"您所拨打的用户是空号"效果是一样的, 但是代价太大, 典型的"可以, 但没必要"
    ioxhklk
        128
    ioxhklk  
       158 天前
    这是个好问题,这个需求能解决很多人的问题,你的解决办法也很好,你可以针对这个痛点进行延伸并创业
    Kiriya
        129
    Kiriya  
       158 天前
    若无必要,勿增实体
    Nimrod
        130
    Nimrod  
       158 天前
    @sun019 checksum 不是为了防止你“记错人”,而是为了防止你“输错数字”。如果你输错数字,那么就有可能发生校验错误,直接在拨打时被判为无效。
    aloxaf
        131
    aloxaf  
       158 天前
    @PrinceofInj 我也非常震惊,点进来之前估计以为是讨论什么历史遗留问题之类的,结果很多人竟然连 checksum 是什么都不理解,还在嘲讽可行性……
    xkeyC
        132
    xkeyC  
       158 天前
    然后某某系统:增加自动计算 checksum 功能,只需记忆前缀号码,一键回到解放前(
    zengxs
        133
    zengxs  
       158 天前
    不如先考虑下,你这个出发点「降低错误拨号」,对运营商是有利还是不利
    noErr
        134
    noErr  
       158 天前
    经常接到有人输错号码打错的电话 - 有多经常
    sun019
        135
    sun019  
       158 天前
    @Nimrod 我理解啊,标题的需求其实是明确的,checksum 技术实现也没啥问题 。但做这个事情的背景是,有没有这个需求。
    jim9606
        136
    jim9606  
       158 天前 via Android
    这东西属于一开始没有的后面就没法加了。国内固话搞过升位也只敢加前缀。
    metaclass
        137
    metaclass  
       158 天前
    有校验位想要凑靓号就很难办了,不可避免会生成比如 4 和 13 之类的,会浪费一些好的号码,除非在校验位里再加入一个算法信息,有多个算法可供选择生成校验位这样能够避免一些不靓的
    jaydenhu8077
        138
    jaydenhu8077  
       157 天前
    @cenbiq 我还是没懂加一位 checksum 来解决输错号码而打错电话的情况?现在有两个人 A\B ,A 的电话 123456 ,B 的电话 123457 ,我想要打给 B 的,但是我输入成 A 的电话号码了,这种情况你怎么解决或者提醒我打错了?因为用户输入的电话号码肯定是唯一的,如果这个号码存在肯定是能呼出成功的啊,号码不存在现在已经有这个功能了“您拨叫的号码为空号”。
    jxl
        139
    jxl  
       157 天前
    @jaydenhu8077 想的一样,程序是无法识别人类的主观意思的对错。
    lumia1020
        140
    lumia1020  
       157 天前
    既然实名制,还不如拨号后,直接查询数据库显示姓名的某个字,来确定是否继续拨打。
    但运营商做这个没有驱动力,运营商宁愿做流氓视频彩铃。
    guiys
        141
    guiys  
       157 天前 via Android
    极小众没必要。99.9%的电话是从名片打出来的
    williampan
        142
    williampan  
       157 天前
    你就是以本我的角度出发,破坏盈利模式呀
    yh7gdiaYW
        143
    yh7gdiaYW  
       155 天前
    @cenbiq 你这个"大多时候"就是你自己按自己的经历假定的,换个人比如我就没感觉到单纯按错键的占比有这么高。你这个方案是通过给所有人增加复杂度的方式,解决了一部分打错电话的情况,这听起来很像游戏策划的风格...
    cenbiq
        144
    cenbiq  
       155 天前
    @jaydenhu8077 你的例子就很适合,checksum 就是可以防止你说的这种情况,比如说按照某种 checksum 算法 12345-后面只能跟 6 ,那么你输入 7 一定提示你号码不存在/验证失败,你拨给 123457 拨不出去因为不符合 checksum 规则,它不是一个可能的号码。如果错中间 N 位同样过不了 checksum ,除非你的错误正好原号码位和 checksum 位都对应了,那这就很巧了(类似于 md5 碰撞
    jaydenhu8077
        145
    jaydenhu8077  
       154 天前
    @cenbiq 你还是没懂我意思啊,我打的号码 123457 ,但是我输入的号码 123456 是确实存在的,这个怎么能验证失败?就是 checksum 算法怎么确定我要打的号码是 123457 而不是 123456 ,这两个号码都是真实存在的,这个 checksum 怎么知道我要打的号码是 123457 ,最简单的问题我号码没输入完整之前 checksum 怎么知道我要打给谁?
    cenbiq
        146
    cenbiq  
       154 天前
    @jaydenhu8077 你还是没懂 checksum ,checksum 保证了不会 1-2 位数字变动能给你拨出去的可能,原号码 123457 如果是一个存在的号码,那么 123456 就一定不是一个可能的号码
    jaydenhu8077
        147
    jaydenhu8077  
       154 天前
    @cenbiq 那按你这样说的还是没有解决输错号码打错号码的情况啊,按你说的‘原号码 123457 如果是一个存在的号码,那么 123456 就一定不是一个可能的号码’,这也只能确定我输入的这个号码是不存在。现在有个情况是你有一个号码,我也有一个号码,第三个人想打你的电话号码,但是输成我的号码了,这情况怎么避免?而且你在什么时机下校验呢?手机号码 11 位,不可能我只输入 7 或 8 位就能判断我输入的是错的吧?你还是没解释清楚,在我没输入全部的号码之前你怎么判断我输入的是错误的
    cenbiq
        148
    cenbiq  
       154 天前
    @jaydenhu8077 你搞混了 validation 和 identification 两个概念,checksum 只能做 validation 即有效性验证,让你输入完手机号就能告诉你是否是一个可能的手机号,无法帮你去 identification 。就以你的例子,你都把两个人号码完全记混了,这说明你需要的是通讯录。checksum 校验当然发生在输入完完整号码时
    lw4free
        149
    lw4free  
       154 天前
    如果 checksum 在终端 那在用的功能机和固话就会忽略这个 checksum 功能 所以只能在运营商端实现 增加 checksum 一定要增加位数吧 在用的号码肯定还继续用吧 checksum 也就只能是通过增发全新号码段实现 每年新增的号码对比在用的号码 再算上按错号码的几率 运营商花几十亿甚至几百亿(如果系统和数据库不兼容增加号码位数可能费用甚至上千亿)为了解决这个微小概率事件 而且这功能是不盈利的 除非是工信部大老板疯了吧 最后 对于按错号码的人来说 他唯一的区别是听到对方说他打错了和 checksum 系统提示号码错了 他还是要核对号码后打第二次的 并没什么区别啊
    biubiuF
        150
    biubiuF  
       154 天前
    能打通就说明电话号码有效啊,不明白加了校验位有啥用
    jaydenhu8077
        151
    jaydenhu8077  
       154 天前
    @cenbiq 那这个 checksum 有什么用?我刚举的例子是你知道两个人的电话号码,也可以把记混理解为打错电话了呀,‘让你输入完手机号就能告诉你是否是一个可能的手机号’,当我输入完成的这个号码真实存在就肯定能打出去,如果不存在现在运营商已经有这个功能了“您拨叫的用户是空号”,你还是没讲清楚加个 checksum 的有什么具体作用,该打错的还是会打错电话
    pWHx3x96
        152
    pWHx3x96  
       154 天前
    通信是一个比互联网还要更考虑向前兼容的事情,只能说最早分配号码的时候没想那么多。
    电话网络是一个树状结构,有一级一级的交换局(各地邮电大楼为代表)和对应区号,后面上手机的时候也就把规则继续沿用了。
    pureGirl
        153
    pureGirl  
       153 天前
    打错就打错呗,影响到谁了,加了 checksum 电话号码还少了一位,而且一个 checksum 放最后也不好看啊
    kangwei
        154
    kangwei  
       140 天前
    很简单,运营商比起费钱做校验规则,更希望人们多打错电话。
    1  2  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2731 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:56 · PVG 22:56 · LAX 07:56 · JFK 10:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.