|
- 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
- }
|