UUID与随机令牌生成器

生成UUID v4和随机HEX令牌,还能判断手上的UUID属于哪个版本。所有内容都不会离开你的浏览器。

UUID v4

UUID识别器

随机HEX令牌

UUID的结构

UUID(通用唯一识别码)是128位的标识符,不需要中央机构分配编号,就能给记录、文件、会话起一个唯一的名字。常见写法是32位十六进制数按8-4-4-4-12分成五段,用连字符连接,共36个字符。 现行规范是2024年5月发布的RFC 9562,取代了此前的RFC 4122。不论哪个版本,第三段的第一个字符表示版本,第四段的第一个字符表示变体(标准UUID为8、9、a或b,即高两位是 10)。 在 xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx 中,"4"代表版本4,y是8、9、a、b之一。

版本4固定这6个位,其余122位全部用随机数填充。其他版本的做法不同:版本1用时间戳加节点标识,版本3和5对命名空间与名称做哈希(分别是MD5和SHA-1,相同输入得到相同UUID),版本7以Unix毫秒时间戳开头,可按创建顺序排序。 规范还定义了全0的Nil UUID和全1的Max UUID两个特殊值。

本工具如何生成v4

工具调用浏览器内置的 crypto.randomUUID(),它基于密码学安全的随机源返回版本4的UUID,但只在HTTPS或localhost这类安全上下文中可用。 不可用时,会退而使用 crypto.getRandomValues() 取16个随机字节,把第7个字节的高4位改为 0100(版本4),把第9个字节的高2位改为 10(标准变体),再整理成8-4-4-4-12的格式。 两种方式的随机源都不是Math.random(),因为它可预测,不适合用于不能被猜到的标识。数量、大写、连字符和花括号选项只改变写法,不改变数值。

碰撞概率:用公式计算,不凭印象

设随机位数为b,生成n个值时出现任意重复的概率可用生日问题近似式 p ≈ n² / (2 · 2b) 估算(p较小时成立)。版本4的b=122,2122约为5.3 × 10³⁶。

生成数量 n出现重复的概率 p
1,000,0009.4 × 10⁻²⁶
1,000,000,0009.4 × 10⁻²⁰
1,000,000,000,0009.4 × 10⁻¹⁴
1,000,000,000,000,0009.4 × 10⁻⁸

生成10亿个时概率约为9.4 × 10⁻²⁰。要让概率达到50%,大约需要2.7 × 10¹⁸个,即使每秒生成10亿个也要持续约86年。把风险压到十亿分之一以内,最多约1.0 × 10¹⁴个。 这些数字的前提是随机源均匀且不可预测。现实中的重复多来自随机数质量差、克隆的虚拟机状态相同或程序复用了值,而不是公式本身。所以由客户端生成的ID所在列,仍应在数据库里加UNIQUE约束。

作为数据库主键

随机的v4无需协调就能到处生成,但在有序索引里,插入位置分散,页分裂更多;自增或按时间有序的ID则只往末尾追加。按时间排序的v7可以缓解这一问题,但创建时间会暴露在值里,而且本工具只生成v4。 存储格式同样重要:36字符的文本占36字节,专用uuid类型或16字节二进制只占16字节。10亿行时,每份键的差距就是20 GB,部分引擎的二级索引还会复制主键,能用专用类型就用。

计算示例

示例1(读取版本)。 f47ac10b-58cc-4372-a567-0e02b2c3d479 的第三段以4开头,所以是版本4;第四段以a开头,二进制为1010,高两位是10,属于标准变体。粘贴到上面的识别器可得到相同结论。固定了4+2个位,随机部分就是128 − 6 = 122位。

示例2(令牌强度)。 n字节的HEX令牌有2n个字符、8n位。16字节是32字符、128位,32字节是64字符、256位。16字节令牌的搜索空间略大于v4的122位,而且没有固定格式的限制。

常见误区

什么时候用HEX令牌

API密钥、会话ID、邀请链接、CSRF令牌这类不能被猜到的值,应该用HEX令牌。工具用crypto.getRandomValues()取随机字节,每个字节写成两个十六进制字符。 令牌只向用户展示一次,服务器保存其哈希更安全;计算哈希可用哈希生成器,给人输入的密码请用密码生成器,测试UUID格式的正则可用正则表达式测试器。

常见问题

生成的值会被上传或保存吗?

不会。它们由浏览器的Web Crypto API生成,不会发送也不会保存;刷新页面会得到不同的值。

UUID会重复吗?

理论上不是零,但v4有122位随机空间,按上面的近似式,10亿个的重复概率约为9.4 × 10⁻²⁰。真正的风险来自随机源质量,所以关键列仍应加UNIQUE约束。

UUID和GUID有区别吗?

格式相同,都是128位,GUID是微软体系的叫法。只有直接交换原始字节时才需要留意字节顺序。

去掉连字符或改成大写,还是同一个UUID吗?

是的。值本身就是32位十六进制数,连字符和花括号只是写法,大小写含义也相同。请选定一种存储格式,比较前先统一。

API密钥该用UUID还是HEX令牌?

用HEX令牌。UUID是为唯一性设计的标识,不是为保密设计的,格式固定而且随机部分只有122位。用UUID给东西命名,用令牌做身份验证。

相关工具