tc_uuid_generator.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. 
  2. #ifndef __TC_UUID_GENERATOR_H
  3. #define __TC_UUID_GENERATOR_H
  4. #include "util/tc_platform.h"
  5. #if TARGET_PLATFORM_LINUX || TARGET_PLATFORM_IOS
  6. #include <unistd.h>
  7. //#include <arpa/inet.h>
  8. #else
  9. #include <process.h>
  10. //#include <winsock2.h>
  11. #endif
  12. #include <atomic>
  13. #include "util/tc_common.h"
  14. #include "util/tc_timeprovider.h"
  15. #include "util/tc_socket.h"
  16. #include "util/tc_singleton.h"
  17. namespace tars
  18. {
  19. class TC_UUIDGenerator : public TC_Singleton<TC_UUIDGenerator>
  20. {
  21. public:
  22. TC_UUIDGenerator():initOK(false)
  23. {
  24. init("");
  25. }
  26. void init(const string& sIP = "")
  27. {
  28. if (isIPV4(sIP))
  29. {
  30. //ip = (uint32_t)inet_addr(sIP.c_str());
  31. ip = ipv4Toint(sIP);
  32. }
  33. else
  34. {
  35. //ip = (uint32_t)inet_addr(getLocalIP().c_str());
  36. ip = ipv4Toint(getLocalIP().c_str());
  37. }
  38. if (ip == 0)
  39. {
  40. initOK = false;
  41. return;
  42. }
  43. pid = (uint32_t)getpid();
  44. seq = 0;
  45. initOK = true;
  46. }
  47. string genID()
  48. {
  49. if (!initOK)
  50. {
  51. return "";
  52. }
  53. char buff[33] = {0};
  54. sprintf(buff, "%08x%08x%08x%08x", ip, pid, (unsigned int)(TNOW), seq++);
  55. return string(buff);
  56. }
  57. protected:
  58. bool isIPV4(const string& ip)
  59. {
  60. vector<int> vs = TC_Common::sepstr<int>(ip, ".");
  61. if (vs.size() != 4)
  62. {
  63. return false;
  64. }
  65. for (size_t i = 0; i < vs.size(); i++)
  66. {
  67. if (vs[i] < 0 || vs[i] > 255)
  68. {
  69. return false;
  70. }
  71. }
  72. return true;
  73. }
  74. uint32_t ipv4Toint(const string& ip)
  75. {
  76. vector<int> vs = TC_Common::sepstr<int>(ip, ".");
  77. if (vs.size() != 4)
  78. {
  79. return 0;
  80. }
  81. uint32_t ipInt = 0;
  82. for (int i = 3; i >= 0; i--)
  83. {
  84. if (vs[i] < 0 || vs[i] > 255)
  85. {
  86. return 0;
  87. }
  88. else
  89. {
  90. ipInt = (ipInt << 8) + vs[i];
  91. }
  92. }
  93. return ipInt;
  94. }
  95. string getLocalIP()
  96. {
  97. vector<string> vs = TC_Socket::getLocalHosts();
  98. for (size_t i = 0; i < vs.size(); i++)
  99. {
  100. if (vs[i] != "127.0.0.1" && (!TC_Socket::addressIsIPv6(vs[i])))
  101. {
  102. return vs[i];
  103. }
  104. }
  105. return "127.0.0.1";
  106. }
  107. private:
  108. uint32_t ip;
  109. uint32_t pid;
  110. std::atomic<uint32_t> seq;
  111. bool initOK;
  112. };
  113. }
  114. #endif //__TC_UUID_GENERATOR_H