| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | 
							- package tools
 
- import (
 
- 	"errors"
 
- 	"sync"
 
- 	"time"
 
- )
 
- const (
 
- 	workerBits  uint8 = 10
 
- 	numberBits  uint8 = 12
 
- 	workerMax   int64 = -1 ^ (-1 << workerBits)
 
- 	numberMax   int64 = -1 ^ (-1 << numberBits)
 
- 	timeShift   uint8 = workerBits + numberBits
 
- 	workerShift uint8 = numberBits
 
- 	startTime   int64 = 1525705533000 // 如果在程序跑了一段时间修改了epoch这个值 可能会导致生成相同的ID
 
- )
 
- type Worker struct {
 
- 	mu        sync.Mutex
 
- 	timestamp int64
 
- 	workerId  int64
 
- 	number    int64
 
- }
 
- func NewWorker(workerId int64) (*Worker, error) {
 
- 	if workerId < 0 || workerId > workerMax {
 
- 		return nil, errors.New("Worker ID excess of quantity")
 
- 	}
 
- 	// 生成一个新节点
 
- 	return &Worker{
 
- 		timestamp: 0,
 
- 		workerId:  workerId,
 
- 		number:    0,
 
- 	}, nil
 
- }
 
- func (w *Worker) GetId() int64 {
 
- 	w.mu.Lock()
 
- 	defer w.mu.Unlock()
 
- 	now := time.Now().UnixNano() / 1e6
 
- 	if w.timestamp == now {
 
- 		w.number++
 
- 		if w.number > numberMax {
 
- 			for now <= w.timestamp {
 
- 				now = time.Now().UnixNano() / 1e6
 
- 			}
 
- 		}
 
- 	} else {
 
- 		w.number = 0
 
- 		w.timestamp = now
 
- 	}
 
- 	ID := int64((now-startTime)<<timeShift | (w.workerId << workerShift) | (w.number))
 
- 	return ID
 
- }
 
 
  |