idWord.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package util
  2. import (
  3. "sync"
  4. "time"
  5. "errors"
  6. )
  7. const (
  8. twepoch = int64(1288834974657) //开始时间截 (2017-01-01)
  9. workeridBits = uint(3) //机器id所占的位数
  10. sequenceBits = uint(4) //序列所占的位数
  11. workeridMax = int64(-1 ^ (-1 << workeridBits)) //支持的最大机器id数量
  12. sequenceMask = int64(-1 ^ (-1 << sequenceBits)) //
  13. workeridShift = sequenceBits //机器id左移位数
  14. timestampShift = sequenceBits + workeridBits //时间戳左移位数
  15. )
  16. // A Snowflake struct holds the basic information needed for a snowflake generator worker
  17. type Snowflake struct {
  18. sync.Mutex
  19. timestamp int64
  20. workerid int64
  21. sequence int64
  22. }
  23. // NewNode returns a new snowflake worker that can be used to generate snowflake IDs
  24. func NewSnowflake(workerid int64) (*Snowflake, error) {
  25. if workerid < 0 || workerid > workeridMax {
  26. return nil, errors.New("workerid must be between 0 and 1023")
  27. }
  28. return &Snowflake{
  29. timestamp: 0,
  30. workerid: workerid,
  31. sequence: 0,
  32. }, nil
  33. }
  34. // Generate creates and returns a unique snowflake ID
  35. func (s *Snowflake) Generate() int64 {
  36. s.Lock()
  37. now := time.Now().UnixNano() / 1000000
  38. if s.timestamp == now {
  39. s.sequence = (s.sequence + 1) & sequenceMask
  40. if s.sequence == 0 {
  41. for now <= s.timestamp {
  42. now = time.Now().UnixNano() / 1000000
  43. }
  44. }
  45. } else {
  46. s.sequence = 0
  47. }
  48. s.timestamp = now
  49. r := int64((now-twepoch)<<timestampShift | (s.workerid << workeridShift) | (s.sequence))
  50. s.Unlock()
  51. return r
  52. }