数据库主键冲突排查
后端在迁移旧系统时,发现两张表的自增主键撞了号,导致联表查询数据错乱。用本工具批量生成 100 个 UUID v4,替换掉冲突的整数字段,确保每条记录在全局唯一。v4 的随机性让新主键不会跟历史数据重号,且生成过程在浏览器本地完成,不经过任何服务器,避免敏感 ID 外泄。
拉取容器镜像时,docker-compose.yml 里 services 下的 UUID 配错一个字母,整个集群就起不来。这个工具在浏览器里生成 v1(基于时间戳+MAC)、v4(随机)、v5(命名空间 SHA-1)、v7(时间有序)四种 UUID,支持单次或批量输出。所有计算走本地 JS,UUID 不会离开当前页面——适合写 Docker Compose、Kubernetes 清单时直接复制粘贴,或压测前批量生成测试标识。
后端在迁移旧系统时,发现两张表的自增主键撞了号,导致联表查询数据错乱。用本工具批量生成 100 个 UUID v4,替换掉冲突的整数字段,确保每条记录在全局唯一。v4 的随机性让新主键不会跟历史数据重号,且生成过程在浏览器本地完成,不经过任何服务器,避免敏感 ID 外泄。
微服务集群里,一次用户请求穿过 6 个节点,每个节点各自打日志,排查问题时没法把散落的日志串起来。运维在网关层用本工具生成 UUID v7,塞进请求头传给下游。v7 按时间戳排序,日志按生成时间自然排好,不用额外写排序逻辑;批量生成 500 个耗时不到 10 毫秒,不拖慢接口响应。
支付回调接口偶尔因网络重试收到重复请求,如果没做幂等处理,用户可能被扣两次款。开发者在发起支付前,用本工具生成一个 UUID v1,作为幂等令牌传给后端。v1 基于网卡 MAC 和时钟序列生成,同一台机器不会重复,且生成时不依赖外部服务,即使数据库宕机也能在本地秒级拿到令牌。
设计团队每天导出几十版 UI 稿,文件名总是「首页_v2_最终版_真的最终版.png」,协作时经常搞混。用本工具给每版文件生成 UUID v5,基于项目名+版本号做命名空间哈希,同一项目同一版本始终产出相同 UUID,不同版本自动不同。这样文件名变成「a3f2c1-首页.png」,一眼看出是第几版,且不会跟其他项目撞名。
QA 在压测时需要生成 1 万条用户注册数据,但每次跑脚本都会因为主键重复而中断。测试人员用本工具批量生成 1 万个 UUID v4,直接粘贴到 SQL 插入语句里,替换自增 ID 字段。生成过程不联网,不触发任何 API 调用,1 万个 UUID 在 2 秒内完成,压测脚本一次跑通。
| 输入 | 输出 | 说明 |
|---|---|---|
| 版本 v1,数量 1 | 550e8400-e29b-41d4-a716-446655440000 | 常规:v1 基于时间戳和节点 MAC 生成,输出固定格式 36 字符,验证基本生成能力 |
| 版本 v4,数量 5 | ["f47ac10b-58cc-4372-a567-0e02b2c3d479", "9c5b94b1-35ad-4e3e-8c2a-6b9f8e1d3a7c", "1a2b3c4d-5e6f-7890-abcd-ef1234567890", "b8c9d0e1-f2a3-4b5c-6d7e-8f9012345678", "e0f1a2b3-c4d5-6e78-9a0b-1c2d3e4f5a6b"] | 常规:v4 完全随机,批量 5 条输出数组,验证批量功能及无重复性 |
| 版本 v5,命名空间 URL "https://example.com",名称 "test" | d8b3c4a5-6e7f-8901-bcde-f12345678901 | 常规:v5 基于命名空间和名称的 SHA-1 哈希,相同输入始终输出相同 UUID,验证确定性 |
| 版本 v7,数量 1 | 018f3a5b-6c7d-8e9f-a0b1-c2d3e4f5a6b7 | 边界:v7 基于 Unix 时间戳(毫秒)排序,输出前 12 位为时间戳,验证时间有序性 |
| 版本 v4,数量 0 | [] | 边界:数量为 0 时返回空数组,验证输入校验(非 1 时返回数组而非对象) |
| 版本 v1,数量 100 | ["550e8400-e29b-41d4-a716-446655440001", "550e8400-e29b-41d4-a716-446655440002", ...](共 100 条,输出为 JSON 数组) | 边界:批量上限 100,验证大数量生成性能及输出格式一致性 |
| 版本 v4,数量 1(输入版本号写成 "V4" 大写) | 错误:版本号无效,支持 v1/v4/v5/v7 | 易错:版本号大小写敏感,大写 V4 不被识别,需提示用户使用小写 |
| 版本 v5,命名空间 UUID "550e8400-e29b-41d4-a716-446655440000",名称 ""(空字符串) | f47ac10b-58cc-4372-a567-0e02b2c3d479 | 易错:名称可为空字符串,但用户可能误以为必填;输出仍为有效 UUID,验证空名称处理 |
1.UUID v5 的命名空间和名称输入错误
namespace: "DNS", name: "example.com"namespace: "6ba7b810-9dad-11d1-80b4-00c04fd430c8", name: "example.com"UUID v5 要求 namespace 是 UUID 格式(如 DNS 的固定 UUID),不是字符串 'DNS'。RFC 4122 规定 namespace 必须是 128 位 UUID,否则输出结果与标准不一致。
2.批量生成时混用不同版本 UUID 的格式
同时生成 v4 和 v7,但输出时未区分版本标识位分别生成:v4 输出 550e8400-e29b-41d4-a716-446655440000,v7 输出 018f3a6e-1b7c-7b00-8000-000000000000UUID v4 版本位固定为 4,v7 版本位固定为 7,变体位也不同。混用不标注会导致下游系统无法按版本解析时间戳或随机性。
3.UUID v7 的时间戳精度理解错误
认为 v7 时间戳精确到纳秒,直接用于排序v7 时间戳为毫秒级(Unix 毫秒),排序时同毫秒内按随机位排序UUID v7 的 48 位时间戳基于 Unix 毫秒,不是微秒或纳秒。同毫秒内生成的多个 UUID 靠随机位(74 位)保证顺序,不能依赖时间戳区分先后。
4.UUID v1 的 MAC 地址和时钟序列未正确处理
生成 v1 时直接使用随机 MAC 地址,不设置时钟序列使用真实 MAC 地址(如 00:1A:2B:3C:4D:5E),时钟序列初始化为 0,并记录上次时间戳UUID v1 依赖 MAC 地址保证全局唯一性,RFC 4122 要求时钟序列在时间回拨时递增。随机 MAC 且无时钟序列管理,可能导致重复或违反规范。
5.批量生成时未考虑 UUID 版本间的长度差异
批量导出时所有版本都按 36 字符处理,忽略 v4/v5/v7 的固定格式所有标准 UUID 均为 36 字符(含连字符),v1/v4/v5/v7 格式一致,无需特殊处理所有标准 UUID 版本(v1/v4/v5/v7)输出格式固定为 8-4-4-4-12 共 36 字符。版本差异仅在位布局和生成算法,不影响长度。
6.UUID v5 的 SHA-1 哈希输出截断理解错误
认为 v5 直接输出 SHA-1 的 160 位哈希v5 对 namespace 和 name 做 SHA-1 后,截取 128 位并设置版本/变体位UUID v5 使用 SHA-1 生成 160 位哈希,但只取前 128 位,再强制设置版本位(5)和变体位(10xx)。直接输出完整 SHA-1 会得到 20 字节而非 16 字节。
7.UUID v4 的随机数生成器选择不当
使用 Math.random() 生成 v4 的随机位使用 crypto.getRandomValues() 或 /dev/urandom 生成 122 位随机数Math.random() 是伪随机且可预测,不满足 UUID v4 对密码学安全随机数的要求。RFC 4122 要求 v4 的随机位必须不可预测,否则可能被枚举。
UUID = 时间戳(60bit) + 时钟序列(14bit) + 节点(48bit) [v1] / 随机位(122bit) [v4] / 命名空间+名称的SHA-1哈希(160bit) [v5] / 时间戳(48bit) + 随机位(74bit) [v7]
时间戳100纳秒间隔的UTC时间,60bit时钟序列防时钟回拨,14bit节点MAC地址或随机,48bit随机位加密安全随机数,122bit(v4)或74bit(v7)SHA-1哈希命名空间+名称的160bit摘要生成v4 UUID:随机生成122bit(如0x3a1b...),拼接版本位0100(4)和变体位10,得32位十六进制:3a1b2c3d-4e5f-6789-abcd-ef0123456789。
本工具是纯前端实现(FE),所有计算在浏览器本地完成,不经过服务器。批量生成数量没有硬性限制,但生成 10 万个以上时,页面渲染和内存占用会明显增加,可能导致浏览器卡顿或标签页崩溃。建议单次生成不超过 1 万个,既保证速度,也避免浏览器无响应。如果确实需要大批量,可分多次生成后自行合并。
v1 基于时间戳和 MAC 地址生成,相同机器短时间内的 UUID 前缀相似,适合需要排序或追踪来源的场景。v4 是完全随机生成,碰撞概率极低,是最通用的选择。v5 需要输入一个名字空间和一个名称,对同一输入总是生成相同 UUID,适合做内容寻址。v7 是较新的版本,带时间戳前缀且随机后缀,比 v1 更安全(不暴露 MAC),同时保持可排序。日常开发选 v4 最省心,需要可排序或可重复生成时选 v1 或 v7。
命名空间(namespace)是一个预先定义的 UUID,比如 DNS 命名空间是 6ba7b810-9dad-11d1-80b4-00c04fd430c8,名称是你想标识的具体字符串(如域名)。v5 的算法会把这俩值做哈希,保证相同的命名空间+名称组合永远生成同一个 UUID。如果随便填,你将失去“可重复性”,因为别人用同样的名称但不同的命名空间会得到不同结果。建议参考 RFC 4122 的预设命名空间(DNS、URL、OID、X.500),除非你有自定义需求。
v4 UUID 有 122 位随机数,理论碰撞概率极低:每秒生成 10 亿个,持续 100 年,重复概率约 50%。v1 和 v7 依靠时间戳+唯一标识,在单台机器上不会重复。全球范围看,v4 的随机性足够强,实际应用中几乎不会发生碰撞。如果仍然担心,可选用 v5 并自定义命名空间(比如用你的域名作为名称空间),这样你的业务系统内生成的 UUID 完全由你控制,不存在外部碰撞。
v1 UUID 的前 8 位(时间戳的低位)在短时间内变化很小,如果一次批量生成间隔毫秒级,这些位确实可能相同。这是 v1 的正常行为:它的时间戳部分精度到 100 纳秒,但实际生成时受操作系统时钟精度限制,同一毫秒内产生多个 UUID 时,时间戳部分会重复,靠时钟序列和节点字段保证唯一性。如果介意视觉上的重复,改用 v4 或 v7;v7 虽然也有时间戳前缀,但后缀随机性更强,视觉上更分散。
完全离线可用。本工具是纯前端实现(FE),UUID 生成逻辑在浏览器中用 JavaScript 完成,不会向任何服务器发送数据。即使断网,页面加载后也能正常使用。v4 的随机数来自浏览器内置的 crypto.getRandomValues(),v1/v7 的时间戳来自本地系统时钟,全部在本地计算。隐私敏感场景(如生成密钥相关 UUID)可以放心使用。
默认生成的是标准格式,带 4 个连字符(如 550e8400-e29b-41d4-a716-446655440000)。如果数据库或接口需要 32 位纯十六进制字符串(无横杠),本工具在结果展示区提供了“复制无横杠版”按钮,或者复制后手动用替换功能去掉 - 即可。注意:v1 和 v7 的时间戳部分带横杠时更易读,但纯 32 位格式对存储更友好。
v1 的节点字段使用了机器 MAC 地址(48 位),这会暴露设备的物理硬件标识。如果你在公共代码或日志中泄露 v1 UUID,别人可以反推出你的网卡厂商甚至具体设备。v7 虽然也包含时间戳,但后缀是随机生成的(48 位随机数),不携带任何硬件信息,既保留了按时间排序的能力,又避免了 MAC 地址泄露风险。因此在新系统中推荐优先使用 v7(如果支持),而不是 v1。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。