package uuidv7 import ( "crypto/rand" "fmt" "time" ) // New returns a UUIDv7 string. func New() (string, error) { var b [16]byte if _, err := rand.Read(b[:]); err != nil { return "", err } ms := uint64(time.Now().UnixMilli()) b[0] = byte(ms >> 40) b[1] = byte(ms >> 32) b[2] = byte(ms >> 24) b[3] = byte(ms >> 16) b[4] = byte(ms >> 8) b[5] = byte(ms) b[6] = (b[6] & 0x0f) | 0x70 b[8] = (b[8] & 0x3f) | 0x80 return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x", uint32(b[0])<<24|uint32(b[1])<<16|uint32(b[2])<<8|uint32(b[3]), uint16(b[4])<<8|uint16(b[5]), uint16(b[6])<<8|uint16(b[7]), uint16(b[8])<<8|uint16(b[9]), uint64(b[10])<<40|uint64(b[11])<<32|uint64(b[12])<<24|uint64(b[13])<<16|uint64(b[14])<<8|uint64(b[15]), ), nil }