github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/data/id/snowid/snowid_2.go (about) 1 package snowid 2 3 import ( 4 "fmt" 5 "strconv" 6 ) 7 8 // SnowWorkerM2 . 9 type SnowWorkerM2 struct { 10 *SnowWorkerM1 11 } 12 13 // NewSnowWorkerM2 . 14 func NewSnowWorkerM2(options *IdGeneratorOptions) ISnowWorker { 15 return &SnowWorkerM2{ 16 NewSnowWorkerM1(options).(*SnowWorkerM1), 17 } 18 } 19 20 // NextID . 21 func (m2 SnowWorkerM2) NextID() uint64 { 22 m2.Lock() 23 defer m2.Unlock() 24 currentTimeTick := m2.GetCurrentTimeTick() 25 if m2._LastTimeTick == currentTimeTick { 26 m2._CurrentSeqNumber++ 27 if m2._CurrentSeqNumber > m2.MaxSeqNumber { 28 m2._CurrentSeqNumber = m2.MinSeqNumber 29 currentTimeTick = m2.GetNextTimeTick() 30 } 31 } else { 32 m2._CurrentSeqNumber = m2.MinSeqNumber 33 } 34 if currentTimeTick < m2._LastTimeTick { 35 fmt.Println("Time error for {0} milliseconds", strconv.FormatInt(m2._LastTimeTick-currentTimeTick, 10)) 36 } 37 m2._LastTimeTick = currentTimeTick 38 result := uint64(currentTimeTick<<m2._TimestampShift) + uint64(m2.WorkerId<<m2.SeqBitLength) + uint64(m2._CurrentSeqNumber) 39 return result 40 }