一个 ID 前八位是 usr_2026、中间六位是时间戳、末尾八位是随机十六进制 ——
它有 22 个字符,看起来像 113 比特,实际上只有 32 比特。
而 32 比特在 八万条之后就是五五开。
所以这一页不猜,它量:逐位数出实际用了多少种字符, 算出每一位真正贡献多少比特。并且对两种系统性偏差都动手 —— 样本少会把熵算低,各位不独立会把熵算高。
贴进来的 ID 只在这个页面里,不上传、不存储。没有服务器 —— 这不是客套:这个工具的用途就是「把生产库里的 ID 拿来看看」, 一个会把它们传走的工具在最该用的场合恰好不能用。
它不知道的事
量出来的熵是个上界。 总熵是把每一位加起来的, 而 H(X,Y) ≤ H(X)+H(Y) 永远成立 —— 各位之间只要有一点相关,真实的熵就比它低。 这一页会去查相关,但只查两两之间的。
所以校验位它看不见。 一个由前八位算出来的校验位, 跟其中任何单独一位都是独立的,只有八位放在一起才决定它 —— 两两检查查不出来。测试里专门钉了这一条,免得这一页在自己做不到的事情上含糊其辞。
它不知道生成器是不是可预测。 熵量的是「这批 ID 之间差多少」,
不是「下一个能不能被猜到」。Math.random() 生成的 ID 每一位都很随机,
而看过几个之后整个序列都能算出来。要防猜,看的是有没有用密码学安全的随机源,
不是看这一页的数字。
「递增」不等于「不会撞」。 纯计数器确实撞不了,靠的是计数器本身; 但「时间戳 + 随机尾巴」也是递增的,而它照样会撞 —— 同一时刻生成的两条共用时间戳, 挡着的只有尾巴那几位。这一页看不出是哪一种,所以它两种都说, 然后让你去看生成代码。