最后更新于

Golang生成UUID字符串

分类: golang

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位