github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/data/id/snowid/idgenerator_default.go (about)

     1  package snowid
     2  
     3  import (
     4  	"strconv"
     5  	"time"
     6  )
     7  
     8  // DefaultIdGenerator .
     9  type DefaultIdGenerator struct {
    10  	Options              *IdGeneratorOptions
    11  	SnowWorker           ISnowWorker
    12  	IdGeneratorException IdGeneratorException
    13  }
    14  
    15  // NewDefaultIdGenerator .
    16  func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator {
    17  	if options == nil {
    18  		panic("dig.Options error.")
    19  	}
    20  
    21  	minTime := int64(631123200000) // time.Now().AddDate(-30, 0, 0).UnixNano() / 1e6
    22  	if options.BaseTime < minTime || options.BaseTime > time.Now().UnixNano()/1e6 {
    23  		panic("BaseTime error.")
    24  	}
    25  
    26  	if options.SeqBitLength+options.WorkerIdBitLength > 22 {
    27  		panic("error:WorkerIdBitLength + SeqBitLength <= 22")
    28  	}
    29  
    30  	maxWorkerIDNumber := uint16(1<<options.WorkerIdBitLength) - 1
    31  	if options.WorkerId > maxWorkerIDNumber {
    32  		panic("WorkerId error. (range:[1, " + strconv.FormatUint(uint64(maxWorkerIDNumber), 10) + "]")
    33  	}
    34  
    35  	if options.SeqBitLength < 2 || options.SeqBitLength > 21 {
    36  		panic("SeqBitLength error. (range:[2, 21])")
    37  	}
    38  
    39  	maxSeqNumber := uint32(1<<options.SeqBitLength) - 1
    40  	if options.MaxSeqNumber > maxSeqNumber {
    41  		panic("MaxSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
    42  	}
    43  
    44  	if options.MinSeqNumber > maxSeqNumber {
    45  		panic("MinSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
    46  	}
    47  
    48  	var snowWorker ISnowWorker
    49  
    50  	switch options.Method {
    51  	case 1:
    52  		snowWorker = NewSnowWorkerM1(options)
    53  	case 2:
    54  		snowWorker = NewSnowWorkerM2(options)
    55  	default:
    56  		snowWorker = NewSnowWorkerM1(options)
    57  	}
    58  
    59  	if options.Method == 1 {
    60  		time.Sleep(time.Duration(500) * time.Microsecond)
    61  	}
    62  
    63  	return &DefaultIdGenerator{
    64  		Options:    options,
    65  		SnowWorker: snowWorker,
    66  	}
    67  }
    68  
    69  // NewLong .
    70  func (dig DefaultIdGenerator) NewLong() uint64 {
    71  	return dig.SnowWorker.NextId()
    72  }