跳至内容

免费 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. 长度:从 1 到 100 的整数。默认值为 21。
  2. 字符集:用来构成 ID 的字符组。默认是字母数字。

输入长度,选择字符集,然后点击“生成”即可创建 ID。点击“复制”可复制它。每当长度或字符集发生变化时,也会自动出现一个新的 ID。

可用的字符集

该工具提供七种固定的字符集,不接受用户自行输入的自定义字母表。

字符集使用的字符字母表大小
字母数字(默认)A-Z、a-z、0-962
URL 安全A-Z、a-z、0-9、-、_64
数字0-910
字母A-Z、a-z52
小写字母a-z26
大写字母A-Z26
符号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 ID21 个字符,可调整随机、紧凑,不能按时间排序
UUID36 个字符标准格式,支持广泛,含连字符
ULID26 个字符可按创建时间排序
KSUID27 个字符可按创建时间排序,包含时间戳
自增整数不定简单且有序,但可预测,也难以在多个独立数据库之间协调

常见问题

默认的 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 个。

参考文献

  1. 安德烈·西特尼克(Andrey Sitnik)。Nano ID license file。GitHub 上的 ai/nanoid LICENSE——MIT 许可证,"Copyright 2017 Andrey Sitnik"。
  2. 安德烈·西特尼克(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。
  3. MDN Web Docs。Crypto: getRandomValues() method。MDN,Crypto.getRandomValues()——该方法返回密码学强度的随机值。
  4. ULID 项目。Universally Unique Lexicographically Sortable Identifier。GitHub 上的 ulid/spec——标准形式为 26 个字符的字符串,而 UUID 为 36 个字符;可按字典序排序。
  5. Segment。KSUID。GitHub 上的 segmentio/ksuid——文本表示始终为 27 个字符,并按时间戳排序。