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  }