You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
995 B
48 lines
995 B
package snow_flake
|
|
|
|
import (
|
|
"goskeleton/app/global/consts"
|
|
"goskeleton/app/global/variable"
|
|
"goskeleton/app/utils/snow_flake/snowflake_interf"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// 创建一个雪花算法生成器(生成工厂)
|
|
func CreateSnowflakeFactory() snowflake_interf.InterfaceSnowFlake {
|
|
return &snowflake{
|
|
timestamp: 0,
|
|
machineId: variable.ConfigYml.GetInt64("SnowFlake.SnowFlakeMachineId"),
|
|
sequence: 0,
|
|
}
|
|
}
|
|
|
|
type snowflake struct {
|
|
sync.Mutex
|
|
timestamp int64
|
|
machineId int64
|
|
sequence int64
|
|
}
|
|
|
|
// 生成分布式ID
|
|
func (s *snowflake) GetId() int64 {
|
|
s.Lock()
|
|
defer func() {
|
|
s.Unlock()
|
|
}()
|
|
now := time.Now().UnixNano() / 1e6
|
|
if s.timestamp == now {
|
|
s.sequence = (s.sequence + 1) & consts.SequenceMask
|
|
if s.sequence == 0 {
|
|
for now <= s.timestamp {
|
|
now = time.Now().UnixNano() / 1e6
|
|
}
|
|
}
|
|
} else {
|
|
s.sequence = 0
|
|
}
|
|
s.timestamp = now
|
|
r := (now-consts.StartTimeStamp)<<consts.TimestampShift | (s.machineId << consts.MachineIdShift) | (s.sequence)
|
|
return r
|
|
}
|