免费 Nano ID 生成器 - 安全的 URL 友好唯一 ID 在线工具
免费在线生成随机的Nano ID唯一标识符,可自由自定义生成的字符串长度和所使用的字符集范围,创建出比传统UUID短约42%、同样具备URL安全特性的紧凑型唯一标识符。适用于数据库主键设计、API访问令牌生成和短链接系统构建等开发场景,全部计算过程均在浏览器本地完成,保护数据隐私安全。
生成的 Nano ID 的长度(1-100 个字符)
选择您的 Nano ID 的字符集
生成的 Nano ID
可视化
文档
Nano ID 生成器会创建一个简短的随机字符串,称为 Nano ID。Nano ID 可用作数据库记录、URL 和 API 令牌等对象的唯一标识符,两个生成的 ID 相同的可能性极小。
什么是 Nano ID?
Nano ID 是随机生成的字符串,用来标记某个对象,使它能与其他所有对象区分开。开发者安德烈·西特尼克(Andrey Sitnik)编写了开源的 Nano ID 库,版权年份为 2017,作为 UUID(通用唯一识别码)的较短替代方案;UUID 是计算领域广泛使用的 36 字符标识符。该库使用的字母表比 UUID 更大,因此它的默认 ID 长度为 21 个字符,而不是 36 个,大约短 42%。该库自身的默认字母表是 URL 安全字符集(A-Za-z0-9_-);本工具则默认使用字母数字字符集。
如何用本工具生成 Nano ID
本页的生成器根据两项设置构建 Nano ID。
- 长度:从 1 到 100 的整数。默认值为 21。
- 字符集:用来构成 ID 的字符组。默认是字母数字。
输入长度,选择字符集,然后点击“生成”即可创建 ID。点击“复制”可复制它。每当长度或字符集发生变化时,也会自动出现一个新的 ID。
可用的字符集
该工具提供七种固定的字符集,不接受用户自行输入的自定义字母表。
| 字符集 | 使用的字符 | 字母表大小 |
|---|---|---|
| 字母数字(默认) | A-Z、a-z、0-9 | 62 |
| URL 安全 | A-Z、a-z、0-9、-、_ | 64 |
| 数字 | 0-9 | 10 |
| 字母 | A-Z、a-z | 52 |
| 小写字母 | a-z | 26 |
| 大写字母 | A-Z | 26 |
| 符号 | A-Z、a-z、0-9,以及常见标点符号 | 88 |
默认选中字母数字字符集。它不含 URL 安全字符集中使用的连字符和下划线,不过仅用字母和数字本来就可以安全地直接放入 URL。
Nano ID 公式
Nano ID 的构建方式是:使用密码学安全的随机数生成器,从字母表中逐个随机挑选固定数量的字符。这种生成器的设计使其输出无法被提前预测。在浏览器中,本工具所用的库从Web Crypto 方法 crypto.getRandomValues() 获取随机字节,该方法返回密码学强度的随机值。
1id = random(alphabet, size)
2使用默认设置时,alphabet 有 62 个字符,size 为 21。
示例
使用默认的字母数字字母表和 21 的长度,可能生成的一个 ID 如下:
1K7pQ2mZxT9vY4nR8jH3wL
2每个字符都是从 62 个字母和数字中独立抽取的,因此运行生成器两次,几乎不会得到相同的字符串。
如何计算碰撞概率
由于 Nano ID 是随机选取的,两个生成的 ID 有可能相同,只是可能性很小。这称为碰撞。生成 k 个 ID 之后至少出现一次碰撞的概率,与“生日问题”的数学原理相同:
1P(collision) ≈ 1 - e^(-k² / (2n))
2这里 n 是可能的 ID 数量:字母表大小的 ID 长度次方,即 n = alphabet_size^length。
算例
对于默认设置,即 62 个字符的字母表和 21 个字符的长度:
1n = 62^21 ≈ 4.4 × 10^37 possible IDs
2针对 1% 的碰撞概率求解公式,得到:
1k ≈ 9.4 × 10^17 IDs
2这意味着大约要生成 940 千万亿个 ID,才会有 1% 的概率出现两个相同的 ID。如果每秒生成一百万个 ID,达到这个数量大约需要 29,700 年。
改用 64 个字符的 URL 安全字母表后,对于同样的 1% 风险,这个数量会略微升高,达到约 1.3 × 10^18 个 ID,因为更大的字母表提供了更多可供选择的 ID。
Nano ID 与其他标识符的比较
ULID 写成 26 个字符的字符串,可按创建时间排序;KSUID 的文本形式始终为 27 个字符,并按其时间戳排序。
| 类型 | 长度 | 备注 |
|---|---|---|
| Nano ID | 21 个字符,可调整 | 随机、紧凑,不能按时间排序 |
| UUID | 36 个字符 | 标准格式,支持广泛,含连字符 |
| ULID | 26 个字符 | 可按创建时间排序 |
| KSUID | 27 个字符 | 可按创建时间排序,包含时间戳 |
| 自增整数 | 不定 | 简单且有序,但可预测,也难以在多个独立数据库之间协调 |
常见问题
默认的 Nano ID 长度和字符集是什么?
默认是字母数字字符集中的 21 个字符:A-Z、a-z、0-9,共 62 个字符。
本工具支持自定义字母表吗?
不支持。它提供七种固定的字符集:字母数字、URL 安全、数字、字母、小写字母、大写字母和符号。
Nano ID 与 UUID 有何不同?
Nano ID 更短。默认是 21 个字符,而 UUID 是 36 个字符,大约短 42%。两者都是随机生成的,并不连续。
Nano ID 能按创建时间排序吗?
不能。Nano ID 完全随机,因此不包含任何关于生成时间的信息。ULID 或 KSUID 等格式则被设计成可按时间排序。
Nano ID 可以安全地用作数据库主键吗?
可以。它应存储在文本或字符串列中,而不是数字列,并配上唯一索引以便快速查找。
一共有多少种可能的 Nano ID?
这取决于所选的长度和字符集。使用默认的 62 个字符的字母表和 21 个字符的长度时,可能的 ID 有 62^21 个,约为 4.4 × 10^37 个。
参考文献
- 安德烈·西特尼克(Andrey Sitnik)。Nano ID license file。GitHub 上的 ai/nanoid LICENSE——MIT 许可证,"Copyright 2017 Andrey Sitnik"。
- 安德烈·西特尼克(Andrey Sitnik)。Nano ID README。GitHub 上的 ai/nanoid——字母表比 UUID 更大(
A-Za-z0-9_-),"ID size was reduced from 36 to 21 symbols";在浏览器中使用 Web Crypto API。 - MDN Web Docs。Crypto: getRandomValues() method。MDN,Crypto.getRandomValues()——该方法返回密码学强度的随机值。
- ULID 项目。Universally Unique Lexicographically Sortable Identifier。GitHub 上的 ulid/spec——标准形式为 26 个字符的字符串,而 UUID 为 36 个字符;可按字典序排序。
- Segment。KSUID。GitHub 上的 segmentio/ksuid——文本表示始终为 27 个字符,并按时间戳排序。