blob: ffb78713ade5ab62faaa3a886a0c71891f2b3386 [file] [log] [blame]
package util
import (
"sync/atomic"
)
var (
UUID int64 = 1000
serverNodeId = 1
UUID_INTERNAL int64 = 2000000000
initUUID int64 = 0
)
func GeneratorUUID() int64 {
id := atomic.AddInt64(&UUID,1)
if id >= getMaxUUID() {
if UUID >= id {
newId := id - UUID_INTERNAL
atomic.CompareAndSwapInt64(&UUID,id, newId)
return newId
}
}
return id
}
func SetUUID(expect int64, update int64) bool {
return atomic.CompareAndSwapInt64(&UUID,expect, update)
}
func getMaxUUID() int64 {
return UUID_INTERNAL * (int64(serverNodeId) +1)
}
func GetInitUUID() int64 {
return initUUID
}
func Init(svrNodeId int) {
// 2019-01-01 与 java 版 seata 一致
var base uint64 = 1546272000000
serverNodeId = svrNodeId
atomic.CompareAndSwapInt64(&UUID,UUID,UUID_INTERNAL*int64(serverNodeId))
current := CurrentTimeMillis()
id := atomic.AddInt64(&UUID, int64((current - base)/UnixTimeUnitOffset))
initUUID = id
}