github.com/yitter/idgenerator-go@v1.3.3/idgen/DefaultIdGenerator.go (about)

     1  /*
     2   * 版权属于:yitter(yitter@126.com)
     3   * 代码编辑:guoyahao
     4   * 代码修订:yitter
     5   * 开源地址:https://github.com/yitter/idgenerator
     6   */
     7  
     8  package idgen
     9  
    10  import (
    11  	"strconv"
    12  	"time"
    13  )
    14  
    15  type DefaultIdGenerator struct {
    16  	Options              *IdGeneratorOptions
    17  	SnowWorker           ISnowWorker
    18  	IdGeneratorException IdGeneratorException
    19  }
    20  
    21  func NewDefaultIdGenerator(options *IdGeneratorOptions) *DefaultIdGenerator {
    22  	if options == nil {
    23  		panic("dig.Options error.")
    24  	}
    25  
    26  	// 1.BaseTime
    27  	minTime := int64(631123200000) // time.Now().AddDate(-30, 0, 0).UnixNano() / 1e6
    28  	if options.BaseTime < minTime || options.BaseTime > time.Now().UnixNano()/1e6 {
    29  		panic("BaseTime error.")
    30  	}
    31  
    32  	// 2.WorkerIdBitLength
    33  	if options.WorkerIdBitLength <= 0 {
    34  		panic("WorkerIdBitLength error.(range:[1, 21])")
    35  	}
    36  	if options.WorkerIdBitLength+options.SeqBitLength > 22 {
    37  		panic("error:WorkerIdBitLength + SeqBitLength <= 22")
    38  	}
    39  
    40  	// 3.WorkerId
    41  	maxWorkerIdNumber := uint16(1<<options.WorkerIdBitLength) - 1
    42  	if maxWorkerIdNumber == 0 {
    43  		maxWorkerIdNumber = 63
    44  	}
    45  	if options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber {
    46  		panic("WorkerId error. (range:[0, " + strconv.FormatUint(uint64(maxWorkerIdNumber), 10) + "]")
    47  	}
    48  
    49  	// 4.SeqBitLength
    50  	if options.SeqBitLength < 2 || options.SeqBitLength > 21 {
    51  		panic("SeqBitLength error. (range:[2, 21])")
    52  	}
    53  
    54  	// 5.MaxSeqNumber
    55  	maxSeqNumber := uint32(1<<options.SeqBitLength) - 1
    56  	if maxSeqNumber == 0 {
    57  		maxSeqNumber = 63
    58  	}
    59  	if options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber {
    60  		panic("MaxSeqNumber error. (range:[1, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
    61  	}
    62  
    63  	// 6.MinSeqNumber
    64  	if options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber {
    65  		panic("MinSeqNumber error. (range:[5, " + strconv.FormatUint(uint64(maxSeqNumber), 10) + "]")
    66  	}
    67  
    68  	// 7.TopOverCostCount
    69  	if options.TopOverCostCount < 0 || options.TopOverCostCount > 10000 {
    70  		panic("TopOverCostCount error. (range:[0, 10000]")
    71  	}
    72  
    73  	var snowWorker ISnowWorker
    74  	switch options.Method {
    75  	case 1:
    76  		snowWorker = NewSnowWorkerM1(options)
    77  	case 2:
    78  		snowWorker = NewSnowWorkerM2(options)
    79  	default:
    80  		snowWorker = NewSnowWorkerM1(options)
    81  	}
    82  
    83  	if options.Method == 1 {
    84  		time.Sleep(time.Duration(500) * time.Microsecond)
    85  	}
    86  
    87  	return &DefaultIdGenerator{
    88  		Options:    options,
    89  		SnowWorker: snowWorker,
    90  	}
    91  }
    92  
    93  func (dig DefaultIdGenerator) NewLong() int64 {
    94  	return dig.SnowWorker.NextId()
    95  }
    96  
    97  func (dig DefaultIdGenerator) ExtractTime(id int64) time.Time {
    98  	return time.UnixMilli(id>>(dig.Options.WorkerIdBitLength+dig.Options.SeqBitLength) + dig.Options.BaseTime)
    99  }