短信验证码去歧义
运营同学发现,发给用户的6位纯数字验证码里,'1'和'l'、'0'和'O'在手机屏幕上极易看错,导致大量重试。用本工具将字符表限定为'23456789ABCDEFGHJKLMNPQRSTUVWXYZ'(去掉易混淆的0/O/1/I/l),生成8位短码,用户误输率从12%降到0.3%,且无需后端额外处理。
从 GitHub 项目复制一串 ID 到代码里,发现里头有下划线和连字符,lint 直接报错。NanoID 工具让开发者自定义字符表——去掉易混淆的 0/O、1/l/I,或只留大小写字母,同时指定长度来平衡冲突概率与可读性。生成的 ID 不上传服务器,全部在浏览器本地完成,适合在 API 密钥、短链接、数据库主键等场景下快速取用。
运营同学发现,发给用户的6位纯数字验证码里,'1'和'l'、'0'和'O'在手机屏幕上极易看错,导致大量重试。用本工具将字符表限定为'23456789ABCDEFGHJKLMNPQRSTUVWXYZ'(去掉易混淆的0/O/1/I/l),生成8位短码,用户误输率从12%降到0.3%,且无需后端额外处理。
电商运营发现,8位纯数字优惠券码被脚本批量尝试兑换,单日损失2万元。用本工具将字符表设为大小写字母+数字混合(共62字符),长度拉到12位,生成的券码空间膨胀至62^12≈3.2×10^21,枚举成本远超收益。同时把字符表里的'0'和'O'去掉,客服收到的误输入投诉归零。
团队用自增ID做短链(/a/1,/a/2),被爬虫遍历抓取了全部链接。改用本工具生成6位自定义字符表ID(仅小写字母+数字,去掉l/0/1),碰撞概率在10万条记录下低于1×10^-9。同时把字符表里的'1'和'l'去掉,用户在电话里口述短链时不再说'是数字一还是字母L'。
后端日志里用UUID做请求追踪ID,但运维发现部分ID末尾恰好是'fuck'或'kill'等单词,被合规部门要求整改。用本工具把字符表限定为'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'(去掉元音字母A/E/I/O/U和易混淆字符),生成的8位追踪ID既不会拼出英文单词,也避免了'0/O'误读,日志解析速度不变。
产线工人需要手抄设备序列号贴到机箱上,原序列号含'B/8'、'G/6'、'S/5'等易混字符,每天有3-5台贴错导致返工。用本工具将字符表精简为'ACDEFHJKLMNPRTUVWXY3479'(仅保留视觉差异明显的字符),长度固定10位,工人抄写错误率从8%降至0.2%,且产线扫码枪识别率提升至99.9%。
| 输入 | 输出 | 说明 |
|---|---|---|
| 字符表: abc123, 长度: 8, 数量: 1 | b1a3c2ab | 常规:使用自定义短字符表生成固定长度ID,验证基本生成逻辑 |
| 字符表: 0123456789ABCDEF, 长度: 32, 数量: 1 | A3F2C9E1B4D8F0A7C6E5B2D1F4A8C3E9 | 常规:模拟UUID风格的长ID,验证长度参数和字符表映射准确性 |
| 字符表: a, 长度: 5, 数量: 1 | aaaaa | 边界:单字符表,所有输出必然相同字符,验证极端表长度下的生成稳定性 |
| 字符表: abc, 长度: 0, 数量: 1 | 边界:长度设为0,输出应为空字符串,验证边界参数处理 | |
| 字符表: 汉字你好, 长度: 3, 数量: 1 | 你好你 | 边界:使用多字节Unicode字符(汉字),验证工具对非ASCII字符表的支持 |
| 字符表: abcdef, 长度: 10, 数量: 5 | facedbcaef, bfacedcabe, ecabfdeabc, dcefabacfe, abfecdabce | 易错:批量生成时,用户常误以为每次结果相同,实际每次独立随机,需注意 |
| 字符表: aA1!@#, 长度: 6, 数量: 1 | A@1a!# | 易错:包含特殊符号和大小写字母的混合字符表,验证工具是否正确处理特殊字符 |
1.字符表包含重复字符,浪费长度空间
字符表设为 "abc123abc"(a、b、c 重复)字符表设为 "abc123"(去重)NanoID 从字符表中随机取字符,重复字符不会增加唯一性,反而在相同长度下减少了有效字符种类,降低抗碰撞能力。
2.字符表长度过短(< 10 个字符),ID 碰撞概率激增
字符表设为 "0123456789"(10 个数字),长度 8字符表设为 "0123456789abcdef"(16 个十六进制字符),长度 8ID 的总组合数 = 字符表长度 ^ 长度。10^8 = 1 亿,16^8 ≈ 43 亿。字符表过短时,相同长度下组合数指数级下降,碰撞风险不可接受。
3.字符表包含 URL 不安全字符,ID 无法直接用于链接
字符表设为 "abc123+/="(包含 +、/、=)字符表设为 "abc123-_"(使用 URL 安全字符 - 和 _)标准 NanoID 默认使用 A-Za-z0-9_-(64 字符),避免 +、/、= 等需要 URL 编码的字符。若字符表含不安全字符,生成的 ID 在 URL 中需额外编码,增加复杂度。
4.长度设为 0 或负数,生成空字符串
长度输入 0 或 -5长度输入 21(NanoID 默认长度)或至少 1NanoID 实现中,长度必须是正整数。长度为 0 时循环不执行,返回空字符串;负数可能引发异常或未定义行为。
5.字符表包含 Unicode 多字节字符,实际 ID 长度与预期不符
字符表设为 "你好世界"(每个汉字 3 字节)字符表设为 "abc123"(ASCII 单字节字符)NanoID 按字符索引取,但 Unicode 字符在 JavaScript 中可能占 2 个码元(如 emoji)。若字符表含多字节字符,生成的 ID 在存储或传输时字节长度会大于字符长度,导致预期偏差。
6.混淆 NanoID 与 UUID 的格式要求
期望 NanoID 输出固定格式如 "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"接受 NanoID 输出为纯随机字符串如 "V1StGXR8_Z5jdHi6B-myT"UUID v4 有固定版本位和变体位(第 13 位为 4,第 17 位为 8/9/a/b),而 NanoID 完全随机,无固定结构。用 UUID 的格式要求校验 NanoID 会误判为无效。
7.字符表包含空格字符,导致 ID 被意外截断
字符表设为 "abc 123"(中间有空格)字符表设为 "abc123"(无空格)空格在 URL、文件名、命令行参数中常作为分隔符,包含空格的 ID 在复制或传递时可能被截断为两部分,破坏完整性。
N = |C|^L
N可能生成的唯一ID总数C自定义字符表,如 abc…LID长度,正整数字符表为 0123456789abcdef(16个字符),ID长度设为 8:N = 16^8 = 4294967296,约 43 亿个不重复 ID。
重复概率取决于长度和字符表大小。默认 21 位、64 字符表时,碰撞概率约 2^-126,远低于 UUID v4 的 2^-122。本工具支持自定义长度和字符表:长度越短、字符表越小,碰撞概率越高。如果用于生产环境,建议保留默认 21 位或更长;测试或非关键场景可缩短到 8-12 位。工具页面输出区会显示当前配置下的理论碰撞概率估算值,方便评估风险。
可以,但有限制。字符表支持任意 Unicode 字符,包括中文、表情符号、特殊符号。注意:字符表里的重复字符会被自动去重,且长度不要超过 256 个字符(浏览器限制)。如果字符表包含 URL 不安全字符(如空格、#、?),生成的 ID 在 URL 中使用前需编码。建议生产环境只用字母数字和连字符、下划线。
能用,但碰撞风险很高。5 位长度、64 字符表时,总组合约 10^9 种,生成几千个 ID 后碰撞概率就显著上升。工具输入框下方会实时显示当前长度+字符表下的总组合数,帮助判断是否够用。如果只是临时打标签(比如一天几十个),5 位可以;如果是长期存储或高并发场景,建议至少 12 位以上。
完全在浏览器本地运行。本工具实现方式为纯前端(FE),所有随机数生成、字符表处理、ID 拼接都在用户设备内存中完成,不会向任何服务器发送数据。生成结果不会离开当前页面,刷新后即消失。适合对数据隐私敏感的场景(如生成 API Key、内部标识符)。
可以,但注意性能差异。NanoID 是随机字符串,相比自增整数主键,在 MySQL/PostgreSQL 的 B-Tree 索引中插入时会产生随机页分裂,写入性能比自增 ID 低 10-20%。如果表写入量大(每秒几百行),建议用 UUID v7 或雪花算法。如果表写入量小(每天几千行),NanoID 完全可用,还能避免自增 ID 暴露数据量。工具生成的 ID 默认大小写敏感,数据库字段需设置 utf8_bin 或类似排序规则。
这是正常行为。NanoID 基于 cryptographically strong 随机数生成,每次调用都从字符表中独立随机选取字符。同一个配置重复生成,结果必然不同。如果需要可复现的 ID(比如从同一个种子生成相同序列),本工具不支持,请改用 hash 类方法(如 MD5/时间戳+序号)。工具页面上的「生成」按钮每次点击都会产生新结果,不会缓存。
理论上最长 256 位(浏览器输入框限制),实际不建议超过 100 位。超过 50 位后,ID 长度对碰撞概率的降低已微乎其微(21 位已足够),反而增加存储和传输开销。工具输入框会限制数字输入范围 1-256,但生成按钮会检查:如果长度超过 100,会弹出提示确认。建议生产环境 21 位,极端安全需求 32 位封顶。
核心区别有三点:① 字符表可自定义(UUID 固定 16 进制),NanoID 能用 64 字符表(A-Za-z0-9_-)使同样长度下组合数更多;② ID 长度可调(UUID 固定 36 字符含连字符),NanoID 最短可到 1 位;③ 排序性不同,UUID v1/v7 带时间戳可排序,NanoID 完全随机不可排序。本工具额外支持去重字符表、排除易混淆字符(如 0O1l)等选项,适合对 ID 可读性有要求的场景。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。