使用方法
- 先在「平台规则」里选目标站点。示例默认选 GitHub:只允许字母、数字和短横线,长度 1~39 位,首尾不能是短横线,也不能出现连续两个短横线。
- 在「生成数量」填 12(示例值,与上面演示表一致),允许 1~30 的整数。
- 「已有用户名」默认是
octocat, OctoCat, nova_river, nоva_river四条,用逗号分隔。这一格不是必填,但填上之后,生成结果里与它冲突的条目会被标红;第 4 条里的о是西里尔字母 U+043E,不是拉丁字母 o,用来演示同形字冲突。 - 拼接方式两项默认都勾:两个词之间加分隔符(GitHub 档用短横线,Twitter / 微信 / 抖音档用下划线,通用档不输出分隔符),并在末尾追加 100~999 的三位数字。
- 点「生成候选用户名」(或在数量输入框里按 Enter),表格逐条给出长度、平台校验结论和冲突情况;点「复制全部(TSV)」可直接贴进表格,点「下载 CSV」存成带 BOM 的文件。
这个用户名生成器能解决什么问题
一是注册前的备选清单:注册新账号时想一次拿到十几条符合目标平台规则的候选名,不用自己想、也不用反复被表单退回。生成结果已经按所选平台的字符集和长度区间过滤过一遍。
二是跨平台同名:四个平台的规则并不一样——GitHub 收短横线但不收下划线,Twitter 收下划线但不收短横线,微信两者都收却要求首字符不是数字,抖音不收短横线。选「通用」档时,工具直接把四套字符集求交集,只留下 62 个字母数字,并把长度区间收窄到 6~15 位,这样生成的名字在四个平台都能提交。
三是改名前的重名排查:平台判重名的口径是“大小写不敏感”,但你眼睛看到的是一串图形。octocat 与 OctoCat 在 GitHub 上会指向同一个账号,而 nova_river 与 nоva_river(第二个字母是西里尔 о)在平台层面是两个完全不同的账号,肉眼却几乎分不出来。这个用户名生成器用 Intl.Collator 抓前者,用 NFKC 折叠抓后者,两类冲突分开标注。
四是批量建测试账号:给自动化测试、压测或内部演示准备一批身份标识时,一次生成 30 条,导出 CSV 直接喂给脚本。
本页不做这些事:不联网查询某个用户名是否已被占用(生成结果只保证“符合规则”,不代表“可以注册”);不做商标、敏感词或实名合规审查;不生成中文昵称、不生成虚构人名或公司名。想编测试用的中文姓名,请用「虚拟姓名生成器」。
生成原理:字符集、长度区间与保留字
这个用户名生成器的核心不是随机拼词,而是规则过滤。每一档平台对应一份规则快照,包含四个字段:字符集、长度下限、长度上限、首字符模式。生成时先按词库拼出候选串,再逐条对照规则判定。
四套字符集的位数。GitHub 是 26 个大写 + 26 个小写 + 10 个数字 + 1 个短横线 = 63 位;Twitter 与抖音结构相同,把小写字母、大写字母、数字、下划线合起来也是 63 位;微信把小写字母、大写字母、数字、下划线、减号都收了,是 64 位。四者求交集后只剩 26 + 26 + 10 = 62 位,短横线和下划线都被淘汰——这就是「通用」档字符集的来源。
长度区间怎么定。四档的下限分别是 1、4、6、4,取其中最大的 6;上限分别是 39、15、20、20,取其中最小的 15。所以通用档是 6~15 位。真正卡住你的是 Twitter 的 15 位上限和微信的 6 位下限:想跨平台同名,就得按最紧的那一档来设计。
保留字清单 36 个。平台会预留一批名字,注册时会直接拒绝。工具内置 admin administrator api root login logout signin signup www mail ftp help about pricing support security contact blog shop store docs status settings account new app dev test official system mod moderator staff team null undefined 共 36 个,生成后逐条比对(按不区分大小写比对),命中就标红。
数字后缀的作用。词库只有 24 个词,两两组合是 576 种形态;追加 100~999 的三位数字后,单条生成空间扩大到 24 × 24 × 900 = 518,400 种。一次生成 12 条时,按生日悖论估算出现重复的概率约为 66 / 518,400 ≈ 0.01273%(约七千八百五十五分之一),所以结果区里几乎不会看到两条一样的名字;万一撞上,工具会自动重抽。
冲突判定用两层。第一层是 Intl.Collator('en', { sensitivity: 'base' }),它按 Unicode 排序算法(UCA)把大小写和变音符号折叠到同一权重,所以 octocat、OctoCat、OCTOCAT 两两比较都返回 0,判定为“注册层面同一个名字”。第二层是 String.prototype.normalize('NFKC') 加一张同形字映射表,用来抓那些 Collator 抓不到的字符。
完整示例(数值仅作演示)
示例条件与页面打开时的默认值完全一致:平台 GitHub、数量 12 条、两项拼接全勾、已有用户名四条。
- 12 条候选名的长度落在 12~16 字符之间,平均 14.08 字符,全部通过 GitHub 规则校验;
- 因为 GitHub 上限是 39 位,12~16 位的长度离上限还有 23 位余量,不加数字后缀也不会逼近上限;
- 已有用户名自检得出 1 组大小写冲突(octocat ↔ OctoCat)和 1 组同形字冲突(nova_river ↔ nоva_river);
- 若把平台改成「通用」,同样勾选下长度会被收窄到 6~15 位,最长的那条
willowzenith618刚好 15 位,不越界; - 单条生成空间 518,400 种,12 条中任意两条重名的概率约 0.01273%。
下面这一组就是默认条件(GitHub 档)下真机生成的结果,仅作排版演示——你点一次按钮得到的会是完全不同的内容:
amber-nova431、cedar-grove907、delta-ember218、falcon-prism640、harbor-ivory352、jade-lotus784kelp-maple129、nova-onyx506、quartz-river873、solar-tower264、umber-vertex395、willow-zenith618
四个平台规则与跨平台通用档对照表
下表是工具内置的规则快照,各平台口径可能调整,以官方注册页为准。注意「大小写敏感」一列:四家都是不敏感,也就是说注册层面大小写不产生新的唯一名。
| 平台 | 字符集 | 位数 | 长度区间 | 首字符 | 大小写 | 典型限制 |
|---|---|---|---|---|---|---|
| GitHub | 字母 + 数字 + - | 63 | 1~39 | 字母或数字 | 不敏感 | 首尾不能是短横线,不能连续两个短横线,. 会被归一成 - |
| Twitter / X | 字母 + 数字 + _ | 63 | 4~15 | 字母 | 不敏感 | 不能以数字或下划线开头,不能全是数字,不含 twitter、admin |
| 微信 | 字母 + 数字 + _ + - | 64 | 6~20 | 字母或下划线 | 不敏感 | 不能以数字开头,一年只能改一次,释放出的旧号别人不能用 |
| 抖音 | 字母 + 数字 + _ | 63 | 4~20 | 字母或数字 | 不敏感 | 不收中文、空格、短横线、点号;两次修改需间隔 180 天 |
| 通用(交集) | 字母 + 数字 | 62 | 6~15 | 字母 | 不敏感 | 不含分隔符,四家都能提交 |
第二张表是混淆字符对照,也是本页唯一一处必须靠两层判定的地方:Collator 抓“排序权重相同”,NFKC 抓“归一化后字符串相同”。
| 看起来像 | 实际码位 | Intl.Collator(base) 相等 | NFKC 后相等 | 结论 |
|---|---|---|---|---|
| octocat / OctoCat | 两侧都是 U+0041 系列 | 相等 | 相等 | 注册层面同一个名字,抢占会失败 |
| a / a | U+0061 / U+FF41 全角 | 相等 | 相等 | 全角字母会被 ICU 与 NFKC 双重折叠 |
| I / Ⅰ | U+0049 / U+2160 罗马数字 | 相等 | 相等 | 罗马数字兼容字符会被折叠成 ASCII 的 I |
| Ⅿ / M | U+216F 罗马数字 / U+004D | 相等 | 相等 | 同上,Ⅿ 折叠成 M |
| a / а | U+0061 / U+0430 西里尔 | 不相等 | 不相等 | 两层都抓不到,只能靠同形字映射表兜底 |
| o / о | U+006F / U+043E 西里尔 | 不相等 | 不相等 | 同上,这正是默认示例里那一组 |
| i / і | U+0069 / U+0456 西里尔 | 不相等 | 不相等 | 同上 |
| 0 / Ο | U+0030 / U+039F 希腊 | 不相等 | 不相等 | 同上,数字与希腊大写字母跨脚本 |
输入范围、边界与精度说明
下面这些是刻意设定的边界,知道它们能避免把这页当“查重工具”用:
- 数量 1~30 的整数。上限 30 是为了让表格不至于一次渲染上千行;需要更多就分几次生成,每次都是全新抽取。
- 已有用户名最多 50 条、总长 1200 字符。超过会直接报错,而不是默默截断。冲突判定是逐条两两比较,50 条的配对数是 1225 对,仍在毫秒级。
- “不区分大小写”是注册层面的结论,不是显示层面的。GitHub 保留你注册时的大小写用于展示,但路由与查重按小写口径走,
github.com/OctoCat与github.com/octocat是同一个页面。 Intl.Collator不等于“查同形字”。sensitivity: 'base'只把大小写和变音符号折叠掉,跨脚本的同形字(西里尔 а 与拉丁 a)在四档 sensitivity 下全部判为不相等,所以必须再加一层 NFKC + 同形字映射表。- NFKC 也不是万能的。它会把全角字母、数字、
@、罗马数字兼容字符Ⅿ、连字fi折叠成 ASCII,但西里尔字母、希腊字母一律保持不变。 - 保留字清单是快照。平台会随时增删预留词,本页的 36 个只是常见集合;即使这里没标红,注册时仍可能被官方规则拦下。
- 抖音的长度口径有过变动。历史上出现过 2~20、3~20、4~20 几种说法,本页取较通行的 4~20;如果你的账号提示长度不符,以 App 内实时提示为准。
- 生成结果只保证“符合规则”,不保证“可以注册”。本页不发任何网络请求,无法判断某个名字是否已被占用,也无法判断是否撞到别人的商标。
常见问题
为什么默认选 GitHub 而不是「通用」档?
GitHub 的规则维度最全:既有长度区间,又有短横线的三条位置约束(不能开头、不能结尾、不能连续),还能用短横线做分隔符,演示效果最好。要做跨平台同名,把下拉框切到「通用」即可,那一档会把字符集收窄到 62 位、长度收窄到 6~15 位。
生成的名字会不会已经被别人注册了?
可能会。本页不做联网查询,只负责“按规则生成 + 本地校验”。规则合规和可用性是两件事:一个名字完全符合 GitHub 的字符与长度要求,仍可能十几年前就被占用了。请把结果当作候选清单,再到目标平台逐个试。
为什么 octocat 和 OctoCat 被判为冲突?
因为平台查重名时不区分大小写。工具用 Intl.Collator('en', { sensitivity: 'base' }) 做比较,这一档会把大小写和变音符号折叠到同一个排序权重上,compare('octocat','OctoCat') 返回 0,等价于“同一个名字”。默认 sensitivity 是 variant,那样比会返回非 0,抓不到这类冲突——这正是必须显式写 'base' 的原因。
那 nova_river 和 nоva_river 为什么也算冲突?
后者的第二个字符是西里尔字母 о(U+043E),不是拉丁字母 o(U+006F)。两者码位不同,所以平台层面是两个独立账号,Collator 在 base、accent、case、variant 四档下也都判为不相等;NFKC 同样不会把它折叠成拉丁字母。这类冲突只能靠一张同形字映射表兜底,本工具把它单独标成「同形字冲突」,与「大小写冲突」分开。
为什么通用档不允许下划线和短横线?
因为四家求交集时它们被淘汰了:GitHub 收短横线但不收下划线,Twitter 与抖音收下划线但不收短横线,微信两者都收。交集只剩下 26 + 26 + 10 = 62 个字母数字,所以通用档输出的是不带分隔符的连写形态,例如 willowzenith618。
数字后缀为什么固定三位?
三位(100~999)给出 900 种取值,配合 24 个词的 576 种组合,单条空间正好是 518,400 种,对 12~30 条的批量需求足够。两位只有 90 种、四位是 9000 种,位数越少越容易和别人的名字撞上,位数越多越难记,三位是这两者之间的折中。
生成的名字太长、超出平台上限怎么办?
不会超出。拼接时每加一段都会先测长度,第二个词、分隔符、数字后缀都是“加得上才加”,加不上就跳过;如果拼出来仍短于平台下限(只有微信档 6 位下限配单个 4 字母词时会遇到),工具会补足位数。所以表格里每一条的「平台校验」列都应当是「通过」。
结果能导出吗?
能。「复制全部(TSV)」把当前结果按列用制表符拼成文本放进剪贴板,粘进 Excel 或飞书表格会自动分列;「下载 CSV」输出的是带 UTF-8 BOM 的 .csv 文件,Excel 双击不会乱码。两者都只包含当前已生成的结果,不含页面上的说明文字。