什么是 NanoID?
NanoID 是一个用于 JavaScript 的小巧、安全、URL 友好的唯一字符串 ID 生成器。它生成比 UUID 更短的紧凑标识符,同时保持类似的碰撞抵抗能力。
快速了解
| 全称 | Nano ID |
|---|---|
| 创建时间 | 2017 年由 Andrey Sitnik 创建 |
| 规范文档 | 官方规范 |
工作原理
NanoID 默认使用加密安全的随机数生成器生成 21 个字符的 ID。与 UUID 不同,NanoID 使用更大的字母表(A-Za-z0-9_-),这使得 ID 更短同时保持唯一性。默认的 21 个字符 ID 与 UUID v4 具有相似的碰撞概率。NanoID 在现代 JavaScript 应用程序中很流行,用于生成数据库记录、URL slug 和会话令牌的 ID。它比 UUID 库更小,没有依赖项。
主要特点
- 默认 21 个字符(可配置)
- URL 安全字母表(A-Za-z0-9_-)
- 加密安全的随机生成
- 比 UUID 更小(21 vs 36 个字符)
- 无依赖,体积小(约 130 字节)
- 可自定义字母表和长度
常见用途
- 数据库主键
- URL 友好的 slug 和短链接
- 会话和令牌标识符
- 上传文件命名
- React 组件 key
示例
Loading code...常见问题
NanoID 和 UUID 有什么区别?
NanoID 生成的 ID 更短(21 个字符 vs UUID 的 36 个字符),同时保持相似的碰撞抵抗能力。NanoID 使用 URL 安全的字母表(A-Za-z0-9_-),生成速度快 40%。UUID 使用带连字符的十六进制字符,遵循标准化格式。
NanoID 是加密安全的吗?
是的,NanoID 使用加密安全的随机数生成器(浏览器中的 crypto.getRandomValues,Node.js 中的 crypto.randomBytes)来生成 ID,使其适用于会话令牌等安全敏感的应用场景。
可以自定义 NanoID 的长度和字母表吗?
可以,NanoID 支持自定义。你可以将自定义长度作为参数传递给 nanoid(length),或使用 customAlphabet() 创建具有特定字符集的生成器。例如,customAlphabet('0123456789', 8) 可创建仅包含数字的 8 字符 ID。
NanoID 的碰撞概率是多少?
使用默认的 21 字符长度和 64 字符字母表,NanoID 的碰撞概率与 UUID v4 相似。你需要以每小时 10 亿个的速度生成 ID,持续约 1490 亿年,才有 1% 的概率发生至少一次碰撞。
NanoID 可以作为数据库主键使用吗?
可以,NanoID 通常被用作数据库主键。与 UUID 相比,其紧凑的大小节省了存储空间,URL 安全的格式使其非常适合 Web 应用。但与自增整数不同,随机 ID 可能会影响某些数据库的索引性能。