Nano ID 生成器
在线生成 Nano ID 随机字符串,支持自定义长度与字母表,一次最多生成 100 个,全部在浏览器本地用 crypto.getRandomValues 生成。
免费在线工具
Loading…
使用说明
操作步骤
- 设置数量:在「数量」中填写本次要生成多少个 ID,取值范围 1-100,超出会自动收敛到边界值。
- 设置长度:在「长度」中填写每个 ID 的字符数,默认 21,可填 1-128。
- 选择字母表:直接编辑「字母表」输入框,或点击下方预设快捷标签一键切换:默认(64字符)、纯数字、小写字母+数字、大写字母+数字、十六进制。点击预设后会立即重新生成。
- 生成:点击「生成」按钮,结果按每行一个 ID 输出在下方结果框中。
- 复制:点击「复制结果」把结果框中的全部 ID 一次性复制到剪贴板。
- 加载示例数据:点击后会把数量恢复为 5、长度恢复为 21、字母表恢复为默认 64 字符集,并立即生成一批示例 ID。
字母表校验规则
字母表不能为空、至少需要 2 个字符、且不允许出现重复字符。不满足时结果框会清空并在上方以红色提示具体原因,不会生成任何 ID。
说明
页面打开时会自动用默认参数生成一批 ID,无需先点击按钮。全部计算在浏览器本地完成,输入与结果都不会上传服务器。
功能介绍
Nano ID 是一种比 UUID 更短的唯一字符串方案。默认字母表包含大写字母、小写字母、数字以及下划线和连字符共 64 个字符,默认长度 21 位,可直接用于 URL、文件名和数据库主键,无需额外转义。
核心能力
- 密码学安全随机源:使用浏览器原生
crypto.getRandomValues取随机字节,不使用Math.random。 - 拒绝采样保证均匀分布:通过位掩码加拒绝采样(rejection sampling)取字符,丢弃落在字母表范围外的字节,因此每个字符被选中的概率完全均等,不会像直接取模那样产生统计偏差。
- 完全自定义字母表:可任意指定字符集,并内置 5 组常用预设一键切换。
- 批量生成:单次最多生成 100 个,按行输出,可一键全部复制。
- 纯前端运行:无需联网调用接口,不依赖任何外部 CDN。
碰撞概率参考
在字母表 64 个字符、长度 21 位的默认配置下,即使每秒生成 10 亿个 ID,也约需 1.49×10¹⁰ 年才会有 1% 的概率出现一次重复。缩短长度或缩小字母表都会显著提高碰撞概率,用于主键时建议保留默认配置。
使用场景
生成数据库主键
用默认 21 位配置批量生成 ID 作为表主键,比自增 ID 更难被枚举,比 UUID 更短,且字符集对 URL 安全无需转义。
生成短链接和分享码
缩短长度到 8-12 位并选择「小写字母+数字」预设,生成不区分大小写困扰的短链后缀或邀请码。
生成前端元素唯一 key
在动态列表、表单项、弹层等场景需要稳定唯一标识时,一次生成一批 ID 直接粘贴到测试数据或代码中使用。
生成测试用随机标识
写接口测试或压测脚本时需要大量互不相同的标识,用「纯数字」或「十六进制」预设生成符合特定格式要求的测试数据。
常见问题
Nano ID 和 UUID 有什么区别?
UUID v4 固定 36 个字符(含连字符),字母表只有 16 个十六进制字符;Nano ID 默认 21 个字符、字母表 64 个字符,长度更短但随机空间相当。Nano ID 的默认字符集是 URL 安全的,可直接放进网址和文件名,不需要额外编码。
生成的 ID 安全吗,会不会被预测?
随机源使用浏览器原生的 crypto.getRandomValues,属于密码学安全的伪随机数生成器,不是 Math.random,因此无法根据已生成的 ID 推算出后续 ID。
为什么要用拒绝采样,直接对随机字节取模不行吗?
直接取模会让部分字符出现的概率略高于其他字符(模偏差)。本工具先用位掩码截取,再丢弃落在字母表长度之外的字节,重新取样,从而保证每个字符概率完全相等。代价是偶尔多取几个随机字节,对使用体验没有影响。
字母表可以填中文或表情符号吗?
输入框不限制字符种类,但字母表按单个 UTF-16 码元处理,中文字符可以正常使用,而由代理对组成的表情符号可能被拆开导致输出异常,建议字母表只使用 ASCII 范围内的字符。
长度可以设置得多短?
最小可设为 1,但长度越短碰撞概率越高。以默认 64 字符字母表为例,长度 21 时几乎不可能重复,而长度 6 时生成几万个就有明显概率撞车。用作主键时建议不低于 16 位。
为什么一次最多只能生成 100 个?
这是页面为了保证结果框可读和复制体验设定的上限,填入超过 100 的数字会自动按 100 处理。需要更大批量时可以多点几次「生成」,每次结果都是全新的随机 ID。
数据会上传到服务器吗?
不会。所有 ID 都在你的浏览器本地生成,页面不向服务器发送任何生成请求,关闭页面后不留任何记录。