...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package logger
16
17 import (
18 "crypto/rand"
19 "encoding/hex"
20 "io"
21 )
22
23
24 type UUID4 struct{}
25
26
27 func NewUUID4() *UUID4 {
28 return &UUID4{}
29 }
30
31
32 func (u *UUID4) Generate() (id string, err error) {
33 var uuid [16]byte
34
35 var buffer [36]byte
36
37 if _, err := io.ReadFull(rand.Reader, uuid[:]); err != nil {
38 return "", NewRuntimeError("cannot generate UUID4", err)
39 }
40
41 uuid[6] = (uuid[6] & 0x0f) | 0x40
42 uuid[8] = (uuid[8] & 0x3f) | 0x80
43
44 u.encodeHex(uuid, buffer[:])
45
46 return string(buffer[:]), nil
47 }
48
49
50 func (*UUID4) encodeHex(uuid [16]byte, buffer []byte) {
51 hex.Encode(buffer, uuid[:4])
52 buffer[8] = '-'
53
54 hex.Encode(buffer[9:13], uuid[4:6])
55 buffer[13] = '-'
56
57 hex.Encode(buffer[14:18], uuid[6:8])
58 buffer[18] = '-'
59
60 hex.Encode(buffer[19:23], uuid[8:10])
61 buffer[23] = '-'
62
63 hex.Encode(buffer[24:], uuid[10:])
64 }
65
View as plain text