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

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

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

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

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

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

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

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

    当别人拨打这个号码的时候,局方的通话记录中会记录(并允许用户查询)这个尾号。好的,这下谁卖了我的号码可就一清二楚了。
    shine1996
        125
    shine1996  
       3 天前
    @cenbiq 是的, 我意思只解决了接到电话的人的问题, 不会被骚扰, 就像是访问输入网址网站一样,
    诶输错了,进入一个不认识的网站, 为什么会输入错误呢, 怎么解决输入错误的问题, 就是浏览器书签和电话本一样这是最佳的方案, 而不是增加用户输入成本不让你访问
    wysnxzm
        126
    wysnxzm  
       3 天前
    bro 是特工,也把别人当特工
    niubiman
        127
    niubiman  
       3 天前
    和"您所拨打的用户是空号"效果是一样的, 但是代价太大, 典型的"可以, 但没必要"
    iocntop
        128
    iocntop  
       3 天前
    这是个好问题,这个需求能解决很多人的问题,你的解决办法也很好,你可以针对这个痛点进行延伸并创业
    Kiriya
        129
    Kiriya  
       3 天前
    若无必要,勿增实体
    Nimrod
        130
    Nimrod  
       3 天前
    @sun019 checksum 不是为了防止你“记错人”,而是为了防止你“输错数字”。如果你输错数字,那么就有可能发生校验错误,直接在拨打时被判为无效。
    aloxaf
        131
    aloxaf  
       3 天前
    @PrinceofInj 我也非常震惊,点进来之前估计以为是讨论什么历史遗留问题之类的,结果很多人竟然连 checksum 是什么都不理解,还在嘲讽可行性……
    xkeyC
        132
    xkeyC  
       3 天前
    然后某某系统:增加自动计算 checksum 功能,只需记忆前缀号码,一键回到解放前(
    zengxs
        133
    zengxs  
       3 天前
    不如先考虑下,你这个出发点「降低错误拨号」,对运营商是有利还是不利
    noErr
        134
    noErr  
       3 天前
    经常接到有人输错号码打错的电话 - 有多经常
    sun019
        135
    sun019  
       3 天前
    @Nimrod 我理解啊,标题的需求其实是明确的,checksum 技术实现也没啥问题 。但做这个事情的背景是,有没有这个需求。
    jim9606
        136
    jim9606  
       3 天前 via Android
    这东西属于一开始没有的后面就没法加了。国内固话搞过升位也只敢加前缀。
    metaclass
        137
    metaclass  
       3 天前
    有校验位想要凑靓号就很难办了,不可避免会生成比如 4 和 13 之类的,会浪费一些好的号码,除非在校验位里再加入一个算法信息,有多个算法可供选择生成校验位这样能够避免一些不靓的
    jaydenhu8077
        138
    jaydenhu8077  
       2 天前
    @cenbiq 我还是没懂加一位 checksum 来解决输错号码而打错电话的情况?现在有两个人 A\B ,A 的电话 123456 ,B 的电话 123457 ,我想要打给 B 的,但是我输入成 A 的电话号码了,这种情况你怎么解决或者提醒我打错了?因为用户输入的电话号码肯定是唯一的,如果这个号码存在肯定是能呼出成功的啊,号码不存在现在已经有这个功能了“您拨叫的号码为空号”。
    jxl
        139
    jxl  
       2 天前
    @jaydenhu8077 想的一样,程序是无法识别人类的主观意思的对错。
    lumia1020
        140
    lumia1020  
       2 天前
    既然实名制,还不如拨号后,直接查询数据库显示姓名的某个字,来确定是否继续拨打。
    但运营商做这个没有驱动力,运营商宁愿做流氓视频彩铃。
    guiys
        141
    guiys  
       2 天前 via Android
    极小众没必要。99.9%的电话是从名片打出来的
    williampan
        142
    williampan  
       2 天前
    你就是以本我的角度出发,破坏盈利模式呀
    yh7gdiaYW
        143
    yh7gdiaYW  
       16 小时 11 分钟前
    @cenbiq 你这个"大多时候"就是你自己按自己的经历假定的,换个人比如我就没感觉到单纯按错键的占比有这么高。你这个方案是通过给所有人增加复杂度的方式,解决了一部分打错电话的情况,这听起来很像游戏策划的风格...
    cenbiq
        144
    cenbiq  
       15 小时 44 分钟前
    @jaydenhu8077 你的例子就很适合,checksum 就是可以防止你说的这种情况,比如说按照某种 checksum 算法 12345-后面只能跟 6 ,那么你输入 7 一定提示你号码不存在/验证失败,你拨给 123457 拨不出去因为不符合 checksum 规则,它不是一个可能的号码。如果错中间 N 位同样过不了 checksum ,除非你的错误正好原号码位和 checksum 位都对应了,那这就很巧了(类似于 md5 碰撞
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1153 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:13 · PVG 02:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.