UUID(Universally Unique IDentifier)是一个128位数字的唯一标识符。在Golang中,我们可以使用开源库来轻松生成UUID字符串。
🚀 快速实现
使用 github.com/satori/go.uuid
库生成UUID:
package uuid_utils
import uuid "github.com/satori/go.uuid"
func GenUUIDString() string {
u := uuid.Must(uuid.NewV4())
uId := u.String()
return uId
}
以上代码使用UUID的V4版本,这是目前使用最广泛的版本。
📋 UUID的5个版本
UUID有5个版本,是根据不同的使用场景划分的,而不是根据精度。所有版本在唯一性上都能保证,重复概率近乎为0。
版本说明
版本 | 生成方式 | 特点 |
---|---|---|
V1 | 基于时间戳和MAC地址 | 有规律性,可能暴露MAC地址 |
V2 | 基于时间戳、MAC地址和POSIX UID/GID | 很少使用 |
V3 | 基于MD5哈希 | 相同输入产生相同UUID |
V4 | 基于随机数 | 完全随机,使用最广泛 |
V5 | 基于SHA-1哈希 | 相同输入产生相同UUID,推荐 |
🎯 版本选择建议
生成唯一ID场景
V1版本:
- ✅ 基于时间戳和MAC地址
- ❌ 有一定规律性,可能被预测
- ❌ 会暴露MAC地址
V4版本: 🌟 推荐
- ✅ 完全随机(伪随机)
- ✅ 无规律性,安全性高
- ✅ 使用最广泛
确定性UUID场景
V3版本:
- ✅ 基于MD5哈希算法
- ✅ 兼容性好,出现较早
- ❌ MD5安全性相对较低
V5版本: 🌟 推荐
- ✅ 基于SHA-1哈希算法
- ✅ 安全性更高
- ✅ 相同输入产生相同UUID
🔍 UUID组成格式
基本结构
UUID由36个字符组成:
- 32个字母数字 + 4个连接符(”-”)
- 格式:
8-4-4-4-12
详细格式
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
格式说明:
- M位置:表示UUID版本(1、2、3、4、5)
- N位置:表示UUID变体(8、9、a、b)
示例:
5b572392-a8cf-4345-a440-4a5848f3e07d
🧮 为什么是128位?
计算过程
虽然UUID有36个字符,但实际位数计算如下:
错误计算: (8+4+4+4+12) × 8 = 256位
(按ASCII字符计算)
正确计算: (8+4+4+4+12) × 4 = 128位
(按16进制计算)
原因: UUID使用16进制表示,每个16进制字符只代表4个bit,而不是8个bit。
💡 记忆技巧:UUID = 32个16进制字符 × 4bit = 128位