Nano ID 生成工具

在浏览器中批量生成 URL 安全的简短唯一 ID。可自由指定字符集(默认、字母数字、小写、大写、数字、十六进制)和长度,非常适合需要比 UUID 更短的 ID 的场景。

ID 格式对比

格式 长度 字符集大小 能否按生成顺序排序 说明
Nano ID 默认21个字符(可指定1〜64个字符) 64个字符 不能(完全随机) 仅由 URL 安全字符组成的短随机 ID,可自由更改字符集和长度。
UUID v4 36个字符(含4个连字符) 16个字符(十六进制) 不能(完全随机) 由 RFC 9562 标准化的128位标识符,以连字符分隔的十六进制表示法为标准格式。
ULID 26个字符 32个字符(Base32) 能(前10个字符为时间戳) 开头带有毫秒级时间戳,因此可以按字符串顺序排列生成顺序。

使用技巧

  • Nano ID 使用基于 Web Crypto API 的密码学安全随机数生成,且全部在浏览器内处理,不会发送到 toolbase.cc 的服务器。
  • 默认的64字符字母表(A-Za-z0-9_-)不含符号或空格,可以直接安全地用作URL 路径或文件名
  • 将字符集限定为"仅数字"或"十六进制",可以生成符合现有系统 ID 格式(例如订单编号仅为数字)的 ID。
  • 长度越短,碰撞概率越高。发行量大的系统建议保持默认的21个字符左右,少量测试数据用8〜10个字符左右也可能足够。
  • 增加生成数量后使用"全部复制",便于批量创建测试数据或种子数据。

常见问题

如果想直接将短 ID 用于 URL 或文件名,Nano ID 更合适。如果需要 RFC 标准化的格式,或者重视与其他系统的互操作性,UUID(尤其是 v4)是更稳妥的选择。

在默认的21个字符、64种字符的设置下,具有相当于126位的随机性,实际使用中的碰撞概率几乎可以忽略。计算得出,碰撞概率达到50%所需的生成数量约为1.09×10¹⁹个。

可以,但和 UUID v4 一样是完全随机的,因此插入 B-Tree 索引的效率不如 AUTO_INCREMENT。如果需要按插入顺序排序,建议考虑使用开头带时间戳的 ULID 等方案。

是的。即使长度相同,字符集大小(字母表大小)越小,随机性越低(抵御碰撞的能力也越弱)。若要用仅数字(10种字符)达到与64种字符字母表相同的安全性,需要更长的字符数。
ツールくん

闲话 ― 为什么 Nano ID 能比 UUID 更短

Nano ID 是 PostCSS 的开发者 Andrey Sitnik 于2017年发布的 JavaScript ID 生成库。它没有依赖项,代码量仅有几百字节,却使用密码学安全的随机数,这种设计获得了广泛认可,如今在 npm 上每周下载量达数千万次,成为常用库之一。

ID 的长度取决于所用字符集的大小。UUID 仅使用十六进制(16种字符)来表示128位,因此需要36个字符;而 Nano ID 使用64种字符,仅用21个字符就能表示相当程度的随机性(默认设置下为126位)。这是因为每个字符所携带的信息量(log₂64=6位)大于十六进制(log₂16=4位),这正是缩短长度的原因。

默认设置(21个字符、64种字符)所具有的126位随机性,与 UUID v4 的122位几乎相当。根据生日问题的近似公式计算,碰撞概率达到50%所需的生成数量约为1.09×10¹⁹个,实际使用中几乎无需担心。