mirror of
https://gitee.com/wanwujie/sub2api
synced 2026-04-27 18:04:47 +08:00
32 lines
753 B
Go
32 lines
753 B
Go
|
|
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
|
||
|
|
}
|