/
log_id_v1.go
109 lines (97 loc) · 2.69 KB
/
log_id_v1.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package ulogids
import (
"encoding/hex"
"math/rand"
"net"
"time"
)
/*
┌────────────────┬──────────────┬──────────────────────────────────────────────────────┐
│ yyyyMMddHHmmss │ ip │ random(always 3 bits of time and 3 bits of rand hex) │
├────────────────┼──────────────┼──────────────────────────────────────────────────────┤
│ 20170111104055 │ 010006131078 │ 058EAC │
└────────────────┴──────────────┴──────────────────────────────────────────────────────┘
*/
const (
defaultIp4 = "000000000000"
)
var localIPV4 = findIP4()
func init() {
rand.Seed(time.Now().Unix())
}
func GetLogIdV1() string {
ret := [33]byte{}
t := time.Now()
year, month, day := t.Date()
hour, minute, second := t.Clock()
int2byte(ret[:4], year)
int2byte(ret[4:6], int(month))
int2byte(ret[6:8], day)
int2byte(ret[8:10], hour)
int2byte(ret[10:12], minute)
int2byte(ret[12:14], second)
copy(ret[14:26], localIPV4)
ms := t.UnixNano() / 1e6 % 1000
int2byte(ret[26:29], int(ms))
u32 := rand.Uint32()
u32 >>= 16
src := []byte{byte(u32 & 0xff), byte((u32 >> 8) & 0xff)}
hex.Encode(ret[29:33], src)
for idx := 29; idx < 33; idx++ {
ret[idx] = upper(ret[idx])
}
return string(ret[:])
}
func upper(c byte) byte {
val := c
if val >= 97 && val <= 122 {
return val - 32
}
return c
}
func int2byte(bs []byte, val int) {
size := 10
l := len(bs) - 1
for idx := l; idx >= 0; idx-- {
bs[idx] = byte(uint(val%size) + uint('0'))
val = val / size
}
}
func findIP4() []byte {
addrs, err := net.InterfaceAddrs()
if err != nil {
return []byte(defaultIp4)
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
ip := ipnet.IP.String()
return formatIP(ip)
}
}
}
return []byte(defaultIp4)
}
func formatIP(ip string) []byte {
realIP := []byte(defaultIp4)
idx := 0
for i := len(ip) - 1; i >= 0; i-- {
c := ip[i]
if c == '.' {
idx = (((idx - 1) / 3) + 1) * 3
continue
}
realIP[idx] = c
idx++
}
reverse(realIP)
return realIP
}
func reverse(bs []byte) {
i, j := 0, len(bs)-1
for i < j {
bs[i], bs[j] = bs[j], bs[i]
i++
j--
}
}