Files
go-trustlog/internal/helpers/uuid.go
ryan d313449c5c refactor: 重构trustlog-sdk目录结构到trustlog/go-trustlog
- 将所有trustlog-sdk文件移动到trustlog/go-trustlog/目录
- 更新README中所有import路径从trustlog-sdk改为go-trustlog
- 更新cookiecutter配置文件中的项目名称
- 更新根目录.lefthook.yml以引用新位置的配置
- 添加go.sum文件到版本控制
- 删除过时的示例文件

这次重构与trustlog-server保持一致的目录结构,
为未来支持多语言SDK(Python、Java等)预留空间。
2025-12-22 13:37:57 +08:00

67 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package helpers
import (
"crypto/rand"
"encoding/binary"
"fmt"
"time"
)
const (
// UUID v7 格式常量.
uuidRandomBytesSize = 10 // UUID中随机字节部分的大小
uuidVersion7 = 0x7000 // UUID v7的版本位
uuidVariant = 0x80 // UUID的变体位
uuidTimeMask = 0xFFFF // 时间戳掩码
uuidTimeShift = 16 // 时间戳位移
uuidVariantMask = 0x3F // 变体掩码
)
// NewUUIDv7 生成 UUID v7 并去除连字符.
func NewUUIDv7() string {
// 获取当前时间戳Unix 毫秒时间戳)
now := time.Now().UnixMilli()
// 生成随机字节
randBytes := make([]byte, uuidRandomBytesSize)
_, err := rand.Read(randBytes)
if err != nil {
// 如果随机数生成失败,使用时间戳加一些伪随机值作为备选方案
return fmt.Sprintf("%016x%016x", now, time.Now().UnixNano())
}
// 版本和变体位
// 版本: 0x7 (0111) << 12
// 变体: 0x2 (10) << 6
versionVariant := uint16(uuidVersion7 | uuidVariant)
// 构建 UUID 字节数组
var uuid [16]byte
// 时间戳低32位 (4 bytes)
//nolint:gosec // UUID格式要求的类型转换
binary.BigEndian.PutUint32(uuid[0:4], uint32(now>>uuidTimeShift))
// 时间戳中16位 + 版本 (2 bytes)
//nolint:gosec // UUID格式要求的类型转换
binary.BigEndian.PutUint16(uuid[4:6], uint16(now&uuidTimeMask))
// 时间戳高16位 + 变体 (2 bytes)
binary.BigEndian.PutUint16(uuid[6:8], versionVariant)
// 随机数部分 (8 bytes)
copy(uuid[8:16], randBytes[:8])
// 设置变体位 (第8个字节的高两位为10)
uuid[8] = (uuid[8] & uuidVariantMask) | uuidVariant
// 转换为十六进制字符串并去除连字符
return fmt.Sprintf("%08x%04x%04x%04x%08x%04x",
binary.BigEndian.Uint32(uuid[0:4]),
binary.BigEndian.Uint16(uuid[4:6]),
binary.BigEndian.Uint16(uuid[6:8]),
binary.BigEndian.Uint16(uuid[8:10]),
binary.BigEndian.Uint32(uuid[10:14]),
binary.BigEndian.Uint16(uuid[14:16]))
}