/
normalid.go
118 lines (105 loc) · 4.48 KB
/
normalid.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
110
111
112
113
114
115
116
117
118
package utils
import (
"errors"
"sync"
"time"
"github.com/1319479809/mqtt_test/utils/slog"
)
var (
//Userid 交易模块的雪花ID
FastId *id
NormalId *id
)
func init() {
initIdGenerator()
}
func initIdGenerator() {
NormalId, _ = NewNormalid(1)
}
// A id struct holds the basic information needed for a FastId generator worker
type id struct {
sync.Mutex
timestamp int64
workerid int64
sequence int64
timeendmp int64
}
const (
normalepoch = int64(1609430400 >> 6) //开始时间截 (2020-01-01)
normalepoch6 = int64(1609430400) //开始时间截 (2020-01-01)
normalworkeridBits = uint(3) //机器id所占的位数
normalsequenceBits = uint(10) //序列所占的位数
normalworkeridMax = int64(1<<normalworkeridBits) - 1 //支持的最大机器id数量
normalsequenceMask = int64(1<<normalsequenceBits) - 1 //
normalworkeridShift = normalsequenceBits //机器id左移位数
normaltimestampShift = normalsequenceBits + normalworkeridBits //时间戳左移位数
)
// Newnormalid NewNode returns a new normalId worker that can be used to generate normalId IDs
func NewNormalid(workerid int64) (*id, error) {
if workerid < 0 || workerid > normalworkeridMax {
return nil, errors.New("workerid must be between 0 and 1023")
}
return &id{
timestamp: 0,
workerid: workerid,
sequence: 0,
}, nil
}
// Generate creates and returns a unique normalId ID
// Generate creates and returns a unique normalId ID
func GenerateNormalId() int64 {
NormalId.Lock()
defer NormalId.Unlock()
now := time.Now().Unix() >> 6
if NormalId.timestamp == now {
NormalId.sequence = NormalId.sequence + 1
if NormalId.sequence > normalsequenceMask {
for now <= NormalId.timestamp {
time.Sleep(10 * time.Millisecond)
now = time.Now().Unix() >> 6
}
NormalId.sequence = 1
slog.Cp.Debug().Msgf("GenerateNormalId=================now=%d timestamp=%d time=%d timeendmp=%d time2=%d", now, NormalId.timestamp, time.Now().Unix(), NormalId.timeendmp, time.Now().Unix()-NormalId.timeendmp)
slog.Cp.Debug().Msgf("GenerateNormalId==1================== nows=%b", (now-normalepoch)<<normaltimestampShift)
slog.Cp.Debug().Msgf("GenerateNormalId==2================== workerid=%b", (NormalId.workerid << normalworkeridShift))
slog.Cp.Debug().Msgf("GenerateNormalId==3================== sequence=%b", (NormalId.sequence))
slog.Cp.Debug().Msgf("5 nows=%d %d workerid=%d %d sequence=%d", (now - normalepoch), (now-normalepoch)<<normaltimestampShift, NormalId.workerid, (NormalId.workerid << normalworkeridShift), (NormalId.sequence))
}
} else {
NormalId.sequence = 1
}
NormalId.timestamp = now
NormalId.timeendmp = time.Now().Unix()
r := int64((now-normalepoch)<<normaltimestampShift | (NormalId.workerid << normalworkeridShift) | (NormalId.sequence))
return r
}
// Generate creates and returns a unique normalId ID
func GenerateNormalId6() int64 {
NormalId.Lock()
defer NormalId.Unlock()
now := time.Now().Unix()
if NormalId.timestamp == now {
NormalId.sequence = NormalId.sequence + 1
if NormalId.sequence > normalsequenceMask {
for now <= NormalId.timestamp {
//time.Sleep(time.Second)
time.Sleep(10 * time.Millisecond)
now = time.Now().Unix()
}
end := int64(2684397885)
slog.Cp.Debug().Msgf("GenerateNormalId=================now=%d timestamp=%d ", now, NormalId.timestamp)
slog.Cp.Debug().Msgf("GenerateNormalId==================== nows=%b", (now-normalepoch6)<<normaltimestampShift)
slog.Cp.Debug().Msgf("GenerateNormalId=======20055============= nows=%b", (end-normalepoch6)<<normaltimestampShift)
slog.Cp.Debug().Msgf("GenerateNormalId==2================== workerid=%b", (NormalId.workerid << normalworkeridShift))
slog.Cp.Debug().Msgf("GenerateNormalId==3================== sequence=%b", (NormalId.sequence))
slog.Cp.Debug().Msgf("GenerateNormalId==3================== r=%b", int64((now-normalepoch6)<<normaltimestampShift|(NormalId.workerid<<normalworkeridShift)|(NormalId.sequence)))
slog.Cp.Debug().Msgf("5 nows=%d %d workerid=%d %d sequence=%d", (now - normalepoch6), (now-normalepoch6)<<normaltimestampShift, NormalId.workerid, (NormalId.workerid << normalworkeridShift), (NormalId.sequence))
NormalId.sequence = 1
}
} else {
NormalId.sequence = 1
}
NormalId.timestamp = now
r := int64((now-normalepoch6)<<normaltimestampShift | (NormalId.workerid << normalworkeridShift) | (NormalId.sequence))
return r
}