万物皆有编号 书架

第 02 章 / 共 12 章

第二章 · 名字为什么不够用

第二章 · 名字为什么不够用

先做一个思想实验:把全国的快递、病人、包裹、订单上的编号全部抹掉,只允许用名字。世界还能转吗?

答案是不能,而且崩溃得比你想象得快得多。

一个班五十个人,就有两个张伟

2014 年有人用覆盖 11 亿人口的历史姓名数据做过统计:全国叫「张伟」的约有 29.9 万人,叫「王伟」的约 29 万,前十名每个名字都有二十多万人共用。注意,这不是抽样估算的误差,是实打实按户籍数出来的。

这意味着什么?假如医院只按名字挂号,北京一家三甲医院一天门诊上万人次,碰上两三个「张伟」是数学上的必然。护士喊一声「张伟,三号诊室」,走进去两个人,谁是来做胃镜的,谁是来拆线的?名字在村口管用,是因为村里只有三百人;人一过万,名字就从「标识」退化成了「线索」——它能帮你缩小范围,但永远锁定不了那一个人。

名字的作用是「在一群熟人里把你叫出来」,不是「在十四亿人里把你找出来」。这两件事听着像,其实是两种完全不同的工程问题。

歧义不止重名这一种

就算不重名,名字在大规模系统里还有一堆毛病:

所以大规模系统做的第一件事,就是把「指代」和「描述」分开:编号——一个人工分配的、只负责「唯一指向某个对象」的符号——接管指代,名字退回到描述。这就是编号的第一使命:唯一性,一个号码只对应一个对象,一个对象只对应一个号码。

你可能觉得这是废话——发个号谁不会?但现实里连国家都翻过车。中国的第一代身份证号码从上世纪八十年代开始发放,各地手工编制,结果到 2009 年公安部摸底时,全国竟有 171 万人的身份证号码与别人重号。两个陌生人共用一个号码,意味着在银行、民航、社保系统里他们随时会被当成同一个人。公安用了近十年专项清理,到 2017 年才把重号人数从 171 万压到 8 人——剩下的 8 个人各有特殊困难改不动,最后只好在系统里给他们打上特殊标注,人工兜底。唯一性这条铁律,不是设计出来的,是付过学费才明白的。

那最简单的编号:1、2、3、4……

既然只要唯一,最省事的方案每个程序员都写过:自增 ID——数据库里来一个对象就发下一个整数,第 1 个是 1,第 2 个是 2,永不重复,永不枯竭(至少在 int 溢出之前)。

自增 ID 就像食堂排队发号:窗口只有一个,号一个一个往外发,谁也撞不上谁。前提是——窗口只有一个。

问题恰恰出在「窗口只有一个」上。自增 ID 的唯一性是靠中央集权换来的:必须有一个唯一的权威知道「上一个号发到几了」。小系统里这个权威就是数据库本身,没问题。可一旦业务长大,麻烦接踵而至:

看出来了吗?「唯一」这件事,实现起来有两条路:中心化发号(一个窗口,简单但慢且脆弱)或者让号码足够随机、足够长,长到两台机器瞎编也撞不上(快,但号码变得没法读、没法记)。这就是所有编号系统要面对的第一对矛盾——唯一性想要集中,规模想要分散。

本章小结

名字是给人际关系用的,编号是给系统用的;系统规模一大,唯一性就是第一刚需。但「保证唯一」最便宜的办法—— 集中式地发连号——在规模面前要么成为瓶颈,要么泄露信息。于是工程师被逼向另一个极端:用超长随机数换取「不用协调也撞不上」的唯一。可那样的号码,人就再也读不动了。

唯一与可读,难道真的不可兼得?下一章,我们拿 UUID 和车牌号做一场对照实验,看看这对天生的冤家各自妥协在哪。

万物皆有编号
费曼式写法 · 由多个 AI 代理撰写与互相审校