runMACS
 All Data Structures Files Functions Variables Enumerations Enumerator Macros
uuid.h
Go to the documentation of this file.
1 #ifndef __UUID_H
2 #define __UUID_H
3 
4 #include <chrono>
5 #include <iomanip>
6 #include <random>
7 #include <sstream>
8 #include <string>
9 
10 #include <cstdint>
11 
12 
13 #define UUID_SIZE 16
14 #define UUID_VERSION 4
15 
16 
17 static inline std::string uuid4() {
18  int uuid[UUID_SIZE];
19  std::stringstream uuid_sstr;
20 
21  /* generate random bytes */
22  auto seed = std::chrono::system_clock::now().time_since_epoch().count();
23  std::default_random_engine rand((unsigned int)seed);
24  std::uniform_int_distribution<int> dist(0, 255);
25 
26  for (int i=0; i<UUID_SIZE; ++i) {
27  uuid[i] = dist(rand);
28  }
29 
30  /* set variant */
31  uuid[8] = (uuid[8] & 0x3F) | 0x80;
32  /* set version */
33  uuid[6] = (uuid[6] & 0x0F) | ((UUID_VERSION << 4) & 0xF0);
34 
35  uuid_sstr << std::internal << std::setfill('0') << std::hex
36  << std::setw(2) << uuid[0]
37  << std::setw(2) << uuid[1]
38  << std::setw(2) << uuid[2]
39  << std::setw(2) << uuid[3] << "-"
40  << std::setw(2) << uuid[4]
41  << std::setw(2) << uuid[5] << "-"
42  << std::setw(2) << uuid[6]
43  << std::setw(2) << uuid[7] << "-"
44  << std::setw(2) << uuid[8]
45  << std::setw(2) << uuid[9] << "-"
46  << std::setw(2) << uuid[10]
47  << std::setw(2) << uuid[11]
48  << std::setw(2) << uuid[12]
49  << std::setw(2) << uuid[13]
50  << std::setw(2) << uuid[14]
51  << std::setw(2) << uuid[15];
52 
53  return uuid_sstr.str();
54 }
55 
56 #endif /* __UUID_H */
#define UUID_SIZE
Definition: uuid.h:13
#define UUID_VERSION
Definition: uuid.h:14