什么是UUID 格式转换
同一个 UUID 在不同系统里有不同写法:.NET 用大写加花括号,有些存储层要求去掉连字符,C# 代码里是字节数组,URL 里则常用 Base64url 简写。
这个工具负责在这些写法之间转换,输入的格式不重要 —— 大写小写、带不带连字符、带不带括号都能识别。
使用方法
- 粘贴值,每行一个,最多 200 条。
- 在输出格式里选择目标写法。
- 点击转换,结果按行对应。
- 不在输入里的行会在跳过计数中体现出来。
适用场景
- 把标准 UUID 转成 SQL 字面量,直接写进迁移脚本。
- 为 URL 生成 Base64url 简写。
- 把从数据库导出的大写值统一成小写。
- 为单元测试生成 C# 字节数组。
结构
所有写法表达的都是同一组 128 位。十六进制类写法保留这 128 位,Base64url 用 22 个字符表示同样的内容,字节数组则是把 16 字节逐字节写出来。
UUID 格式转换 的定位
| 选项 | 何时使用 |
|---|---|
转换 | 在九种写法之间改形,值本身不变 |
校验 | 判断是否有效,并说明是哪一位不合法 |
生成 | 产生新值,而不是改写已有的值 |
UUID 各版本速查表
| 版本 | 可排序 | 数据来源 | 适合的场景 |
|---|---|---|---|
| v1 | 不可以 | 时间戳 + MAC 地址 | 仍在依赖 v1 的既有系统 |
| v3 | 不可以 | 名称的 MD5 哈希 | 必须使用 MD5 时的确定性标识符 |
| v4 | 不可以 | 122 位随机数 | 绝大多数普通的唯一标识需求 |
| v5 | 不可以 | 名称的 SHA-1 哈希 | 需要同一名称始终得到同一标识符 |
| v6 | 可以 | 重排后的时间戳 | 既要随机性又要便于排序 |
| v7 | 可以 | 毫秒精度的 Unix 时间 | 数据库主键和事件标识符 |
| v8 | 不可以 | 自定义位布局 | 专有格式和实验性用途 |
这七个版本都是 128 位,都用同样的 8-4-4-4-12 写法表示,区别只在于各个位代表什么。
代码示例
javascript
const compact = id.replace(/-/g, "");
// Base64url
const bytes = new Uint8Array(16);
compact.match(/../g).forEach((h, i) => bytes[i] = parseInt(h, 16));
const b64 = btoa(String.fromCharCode(...bytes))
.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
python
import uuid, base64
u = uuid.UUID(value)
compact = u.hex
b64 = base64.urlsafe_b64encode(u.bytes).rstrip(b"=").decode()
java
UUID u = UUID.fromString(value);
String compact = u.toString().replace("-", "");
常见问题
转换会改变这个 UUID 吗?
不会。九种写法表达的是同一组 128 位,只是外观不同。任意格式互转都不会改变这个值。
去掉连字符还是同一个 UUID 吗?
是的。连字符只是给人看的可读性分组,去掉之后仍然是 32 位十六进制、同一个值。如果存储层不允许有符号,可以放心去掉。
Base64url 为什么只有 22 个字符?
因为它把 128 位编码得更紧凑。16 字节按 6 位一组平分就得到 22 个字符,省掉了连字符,也能安全地放进 URL。代价是可读性变差。