snowflake.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package utils
  2. import (
  3. "time"
  4. )
  5. var (
  6. sn int64 // 序列号占 12 位,十进制范围是 [ 0, 4095 ]
  7. lastTimeStamp int64 // 上次的时间戳(毫秒级), 1秒=1000毫秒, 1毫秒=1000微秒,1微秒=1000纳秒
  8. )
  9. func init() {
  10. lastTimeStamp = time.Now().UnixNano() / 1000000
  11. }
  12. // GetSnowflakeId
  13. // @函数名:GetSnowflakeId
  14. // @函数功能描述: 通过appid获取雪花id Apppid范围在 1~1023
  15. // @参数定义:appId
  16. // @返回值:int64
  17. //
  18. func GetSnowflakeId(appId int64) int64 {
  19. if appId == 0 {
  20. return 0
  21. }
  22. nowTime := time.Now().UnixNano() / 1000000
  23. appId = appId & 0x3FF
  24. sfOne := nowTime << 22
  25. sfTwo := appId << 12
  26. //每次累加,减小时间回滚发生重复的概率
  27. sn++
  28. sfThree := sn & 0xFFF
  29. return sfOne | sfTwo | sfThree
  30. }
  31. // GetAppIdBySnowflakeId
  32. // @函数名:GetAppIdBySnowflakeId
  33. // @函数功能描述: 通过雪花id,返回appid
  34. // @参数定义:snowflakeId
  35. // @返回值:int64
  36. //
  37. func GetAppIdBySnowflakeId(snowflakeId int64) int64 {
  38. if snowflakeId == 0 {
  39. return 0
  40. }
  41. appId := snowflakeId & 0x3FF000
  42. return appId >> 12
  43. }