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