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 }