跳到正文

ULID 与 NanoID 生成

ULID & NanoID Generator

按指定的字母表和长度生成可排序的 ULID 或短小的 NanoID,并给出碰撞概率。

生成 ULID 和 NanoID——36 个字符的 UUID 放进 URL 嫌太长时,大家会去找的两种短 id 格式。它还会按你选的长度和字母表显示碰撞概率的算式,这一步决定 id 是够短还是太短。

🔒 完全在你的浏览器里运行ulidnanoidgeneratorid
种类

26 个字符,可排序,前十位是毫秒时间戳。

生成几个

0个 id

    碰上的可能性有多大

    熵

    80.0位

    到 1% 概率前的个数

    1.56e11

    按每小时 1,000 个算

    18千年

    生日界:P ≈ 1 − exp(−n²/2N)。下面这个数就是它达到百分之一的位置。

    拆开一个 ULID

    ULID 遵循 ULID 规范:48 位毫秒时间戳,接 80 位随机,用 Crockford base32 书写——它去掉了 I、L、O 和 U,念出来不会听错。

    怎么用

    1. 选 ULID 还是 NanoID

      ULID 固定 26 个字符,前十个是毫秒时间戳,所以可排序。NanoID 可以是任何字母表上的任何长度,是纯熵——它没有任何有序的部分。

    2. 设置长度和字母表

      NanoID 默认是 64 个符号上的 21 个字符。更短的 id 或更小的字母表——比如给要念出声的东西用一套无易混字符的集合——都要付出熵的代价,下方的面板会准确显示付出了多少。

    3. 读碰撞那一行

      它给出出现任何碰撞的概率达到百分之一之前能生成多少个 id,以及按一天一千个算这要多久。熵低于 64 位时页面会说出来,因为那是 URL slug 和绝不能被猜到的东西之间的分界线。

    4. 手头有 ULID 就解码一下

      粘进去,面板会打印出创建时间和随机尾部——对于弄清一条记录到底是什么时候生成的很有用。

    常见问题

    短 id 当秘密链接安全吗?

    只有它的熵说安全才安全。21 个字符的 NanoID 有大约 126 位,没问题;10 个字符的大约 60 位,任何愿意花钱的人都猜得到。页面标出所有低于 64 位的情况正是为了这个——短 id 就是短 id,不是秘密。

    为什么自定义字母表出来的还是均匀分布?

    因为符号是用拒绝采样抽取的,而不是 `random % length`。取模这个捷径会让长度不能整除 256 的每一种字母表产生偏差——手写 id 生成器里的常见 bug,不数一遍看不出来。

    「单调」对 ULID 意味着什么?

    同一毫秒之内,普通 ULID 彼此之间是随机顺序。单调模式递增随机字段而不是重新抽取,所以同一毫秒内突发生成的一批仍然按生成顺序排序。

    为什么 ULID 用的 base32 里没有 I、L、O 和 U?

    那是 Crockford 的字母表:它去掉了人念 id 或从屏幕上抄 id 时容易混淆的字符。代价是 32 个符号而不是 36 个,这就是 NanoID 只要 21 个字符而 ULID 需要 26 个的原因。

    可以从这些接进来

    接下来

    这些工具吃得下当前工具的产出,结果可以直接送过去。