第十二章 · 一套好编号长什么样
回到第一章那根 15 位的快递单号。当时它只是一串数字;走过十一章之后,它应该已经变成一张可以逐位读懂的图纸了。这一章不做新案例,做一件更实用的事:把前面所有血泪教训压成一份清单。下次你要给自己的系统设计编号——订单号、设备号、API 密钥——可以逐条对照着检查。
第一条:唯一性,但要先问「在什么范围内唯一」
第二章说过,名字崩溃是因为重名。编号的第一使命是唯一,但「唯一」从来不是一个绝对词,它永远带一个作用域。数据库自增 ID 在一张表里唯一,身份证号在一国之内唯一,UUID(通用唯一识别码,一种 128 位的随机编号,不登记、不协商,靠的是「撞到重号的概率比陨石砸中机房还低」)号称在全宇宙唯一。
作用域越大,代价越高。UUID 用 128 位换来了「随便生成都不撞」,代价是那串 550e8400-e29b-41d4-a716-446655440000 没有任何人能读。所以清单的第一问不是「要不要唯一」,而是:这个号码需要在多大的世界里不撞车?只服务一个小区的快递柜,4 位取件码就够;要服务全球的银行卡,就得老老实实接受 16 位。
第二条:想清楚这个号码是给谁看的
第三章的对照实验还记得吗:UUID 是给机器的,车牌是给人的。给机器看的号码可以丑、可以长、可以毫无意义;给人看的号码必须能念、能抄、能在电话里报给客服。
翻译成人话:编号设计的第一道岔路口,是「读者是谁」。交警一眼要认出肇事车,所以车牌牺牲了绝对唯一;机器之间握手没人看,所以 UUID 牺牲了人类。两头都想要,结果就是两头都妥协——这正是快递单号又分段又带校验的原因。
第三条:装不下的时候,分段而不是加位
第四章的电话区号、第五章的 IP 和域名,讲的是同一个机制:层级——把一个长号码切成几段,每一段只回答一个更小范围的问题。区号第一段回答「哪个国家」,第二段回答「哪个城市」,最后才轮到具体电话。
层级真正的威力不在「省位数」,而在分权:国际电联只管发国家码,发完就不管了;各国自己发城市码,城市自己发局号。没有哪个人需要知道全世界所有电话。一套编号能不能规模化,看的就是它能不能把发号的权力一层层下放出去。第九章的 MAC 地址厂商前缀、第十章的 SWIFT 代码,全是同一个把戏:权威只登记「谁有资格继续往下发」,不登记每一个最终号码。
第四条:假设人会抄错,机器会读脏
第七章的校验位和第八章的二维码,是同一条原则的两代实现:人会抄错,所以编号要会自查。Luhn 算法(信用卡号最后一位的算法,把数字隔位翻倍求和再看能不能被 10 整除)能拦住所有的单个数字抄错、以及绝大多数相邻两位写反——唯一漏网的是把「09」写成「90」这一对特例。后来数学家 Verhoeff 在 1969 年给出了更强的算法,连这类错误也能抓住,但 Luhn 胜在简单到收银员心算都能验,于是活到了今天。
第八章更进一步:与其让人抄完再查错,不如干脆别让人抄。条形码和二维码把编号从「给人看的符号」变成「给光看的图案」,二维码甚至做到缺了三分之一还能扫出来。容错设计的演进方向,是从「检测错误」走向「消灭抄这个动作」。
第五条:给未来留座位
编号一旦发出去就收不回,这是第十章的教训:IBAN 之所以长得那么别扭,是因为它要包住几十个国家的旧账号,谁的旧账都不能作废。设计编号时最昂贵的问题不是「现在够不够用」,而是「十年后还够不够」。
ISBN 是个干净的例子。书号原本是 10 位,2007 年 1 月 1 日全球统一切换到 13 位——不是 10 位不够印了,而是要并入商品条码体系,给将来留容量。切换的方式很讲究:所有旧号码前面直接加 978,旧号原封不动地活在新号里。对比 IPv4 到 IPv6 那种两套系统并行十几年、至今没切完的狼狈,ISBN 的「向前兼容」堪称教科书。好的编号系统会给自己留一排空座位,而不是坐满了再拆墙。
第六条:编号背后必须站着一个管事的
最后一条不在号码里,在号码外。第九章问「谁有权发号」,第十一章的本初子午线告诉你连「零度经线画在哪」都是 1884 年二十几个国家投票投出来的——当时法国投了弃权,因为巴黎子午线落选了。编号系统从来不只是技术设计,它是治理设计:得有一个机构登记、仲裁、处理纠纷,而且这个机构的权威得靠大家认,而不是靠技术强制。
翻译成人话:技术上完美的编号,没有管事的机构背书,就是一张废纸;反过来,机构再权威,号码设计得没法用,也推不动。经纬度能统治地球两百年,是因为它两头都占了。
拿清单验收:那根快递单号
现在把六条清单拍在第一章的单号上:
- 唯一性:日期段 + 流水号,保证同一天同一个网点内不撞,跨天靠日期区分——作用域划得很克制。
- 给谁看:网点编号和校验位给机器,分段结构给分拣员扫一眼就知道去哪。
- 层级:日期、网点、流水,三段各回答一个更小的问题,发号权下放到网点。
- 容错:最后有校验位,面单上还有条形码兜底——人手抄和机器扫各有一道防线。
- 演化空间:15 位对一天的件量是严重超配的,多出来的位数是预留给业务暴涨和扩展新段的。
- 治理:各家公司自定规则,但电子面单时代行业平台统一了接口,发号权集中到了平台。
六条全中。它不是随便长长的一串数字,而是一份微缩的设计文档。
这本书到这里就讲完了,但编号的故事没讲完。前面所有系统有一个共同的隐含前提:被编号的东西——包裹、电话、银行卡、一本书——数量级都在百亿以内。而下一个正在被编号的世界是物联网:每一颗传感器、每一盏路灯、每一只耳标下的牛都要有自己的号。当编号的对象从「亿」涨到「万亿」,当发号的速度从「每天一批」变成「每秒百万」,这份清单里哪一条会先撑不住?这个问题,留给下一个要设计编号系统的人——也许就是你。