snowflake.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package utils
  2. import (
  3. "errors"
  4. "log"
  5. "net"
  6. "sparkteam-dash/pkg/snowflake"
  7. //"github.com/bwmarrin/snowflake"
  8. )
  9. // 使用推特算法生成的唯一ID
  10. var twitSnowNode *snowflake.Node
  11. func InitTwitEquipmentGuid() {
  12. var machineID uint16 = 1
  13. if id, err := lower16BitPrivateIP(); err == nil {
  14. machineID = id
  15. }
  16. machineID &= 0x3ff
  17. var err error
  18. twitSnowNode, err = snowflake.NewNode(int64(machineID))
  19. if err != nil {
  20. log.Fatalln(err)
  21. }
  22. }
  23. func GetTwitEquipmentGuid() string {
  24. // Generate a snowflake ID.
  25. id := twitSnowNode.Generate()
  26. return id.String()
  27. }
  28. func privateIPv4() (net.IP, error) {
  29. as, err := net.InterfaceAddrs()
  30. if err != nil {
  31. return nil, err
  32. }
  33. for _, a := range as {
  34. ipnet, ok := a.(*net.IPNet)
  35. if !ok || ipnet.IP.IsLoopback() {
  36. continue
  37. }
  38. ip := ipnet.IP.To4()
  39. if isPrivateIPv4(ip) {
  40. return ip, nil
  41. }
  42. }
  43. return nil, errors.New("no private ip address")
  44. }
  45. func isPrivateIPv4(ip net.IP) bool {
  46. return ip != nil &&
  47. (ip[0] == 10 || ip[0] == 172 && (ip[1] >= 16 && ip[1] < 32) || ip[0] == 192 && ip[1] == 168)
  48. }
  49. func lower16BitPrivateIP() (uint16, error) {
  50. ip, err := privateIPv4()
  51. if err != nil {
  52. return 0, err
  53. }
  54. return uint16(ip[2])<<8 + uint16(ip[3]), nil
  55. }