snowflake.go 1.1 KB

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