ULID 与 NanoID 生成
ULID & NanoID Generator
按指定的字母表和长度生成可排序的 ULID 或短小的 NanoID,并给出碰撞概率。
生成 ULID 和 NanoID——36 个字符的 UUID 放进 URL 嫌太长时,大家会去找的两种短 id 格式。它还会按你选的长度和字母表显示碰撞概率的算式,这一步决定 id 是够短还是太短。
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,念出来不会听错。
怎么用
选 ULID 还是 NanoID
ULID 固定 26 个字符,前十个是毫秒时间戳,所以可排序。NanoID 可以是任何字母表上的任何长度,是纯熵——它没有任何有序的部分。
设置长度和字母表
NanoID 默认是 64 个符号上的 21 个字符。更短的 id 或更小的字母表——比如给要念出声的东西用一套无易混字符的集合——都要付出熵的代价,下方的面板会准确显示付出了多少。
读碰撞那一行
它给出出现任何碰撞的概率达到百分之一之前能生成多少个 id,以及按一天一千个算这要多久。熵低于 64 位时页面会说出来,因为那是 URL slug 和绝不能被猜到的东西之间的分界线。
手头有 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 个的原因。
可以从这些接进来
接下来
这些工具吃得下当前工具的产出,结果可以直接送过去。
密码生成器
Password Generator
按长度、字符集和是否排除易混字符的规则生成随机密码,需要的话可以一次生成很多条。
随机密钥生成
Random Key Generator
按指定长度生成密码学随机字节,输出十六进制、Base64 或 Base64URL,用作应用的 secret。
UUID 生成
UUID Generator
批量生成 UUID v1、v4、v5 和 v7,并能从 v1 或 v7 的值里解出时间戳。
Base64 编码解码
Base64 Encoder & Decoder
对文本和文件做 Base64 与 Base64URL 编解码,UTF-8 处理正确。
curl 转代码
curl to Code
把一条 curl 命令转成 fetch、axios、Python requests、Go、PHP 或 PowerShell 代码。
文本哈希计算
Text Hash
算出字符串的 MD5、SHA-1、SHA-256、SHA-384、SHA-512 和 CRC-32,输出可选大写或 Base64。