Skip to content

Commit bd6ae69

Browse files
committed
update
1 parent f0b63a9 commit bd6ae69

File tree

1 file changed

+18
-25
lines changed

1 file changed

+18
-25
lines changed

id/id.go

+18-25
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ func New(sid uint64) {
5151
//refresh base
5252
lasttime = templasttime
5353
rollback = 0
54-
base = getlasttime() + getrollback() + getserverid()
54+
atomic.StoreUint64(&base, getlasttime()+getrollback()+getserverid())
5555
} else if templasttime < lasttime {
5656
//rollback
5757
rollback++
5858
if rollback > 63 {
5959
panic("[ID.init] server time rollback more then 60s")
6060
}
61-
base = getlasttime() + getrollback() + getserverid()
61+
atomic.StoreUint64(&base, getlasttime()+getrollback()+getserverid())
6262
}
6363
}
6464
}()
@@ -73,7 +73,7 @@ func getserverid() uint64 {
7373
return serverid << 23
7474
}
7575

76-
const mask uint64 = uint64(63) << 23
76+
const mask uint64 = uint64(7) << 23
7777

7878
func checkserverid(id uint64) bool {
7979
if ((id & mask) >> 23) == serverid {
@@ -85,30 +85,23 @@ func checkserverid(id uint64) bool {
8585
var ERRMAX = errors.New("[ID.GetID]Max id was used up in this second")
8686

8787
func GetID() (uint64, error) {
88-
if !checkserverid(base) {
89-
return 0, ERRMAX
90-
}
91-
newid := atomic.AddUint64(&base, 1)
92-
if !checkserverid(newid) {
93-
return 0, ERRMAX
94-
}
95-
return newid, nil
88+
_, end, e := GetIDs(1)
89+
return end, e
9690
}
9791

98-
var ERRMAXONCE = errors.New("[ID.GetID]Too many ids required once")
99-
100-
func GetIDs(delta uint64) (start uint64, end uint64, e error) {
101-
if delta > 5000 {
102-
return 0, 0, ERRMAXONCE
92+
//range is [start,end],including start and end,if delta is 1,start = end
93+
func GetIDs(delta uint16) (start uint64, end uint64, e error) {
94+
if delta == 0 {
95+
delta += 1
10396
}
104-
if !checkserverid(base) {
105-
return 0, 0, ERRMAX
106-
}
107-
newid := atomic.AddUint64(&base, delta)
108-
if !checkserverid(newid) {
109-
return 0, 0, ERRMAX
97+
for {
98+
oldbase := atomic.LoadUint64(&base)
99+
if !checkserverid(oldbase + uint64(delta)) {
100+
return 0, 0, ERRMAX
101+
}
102+
if !atomic.CompareAndSwapUint64(&base, oldbase, oldbase+uint64(delta)) {
103+
continue
104+
}
105+
return oldbase + 1, oldbase + uint64(delta), nil
110106
}
111-
start = newid - delta
112-
end = newid
113-
return
114107
}

0 commit comments

Comments
 (0)