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 }