Austin Schuh | 64fab80 | 2020-09-09 22:47:47 -0700 | [diff] [blame] | 1 | #include "aos/events/logging/uuid.h" |
| 2 | |
| 3 | #include <array> |
| 4 | #include <random> |
| 5 | #include <string_view> |
| 6 | |
| 7 | namespace aos { |
| 8 | namespace { |
| 9 | char ToHex(int val) { |
| 10 | if (val < 10) { |
| 11 | return val + '0'; |
| 12 | } else { |
| 13 | return val - 10 + 'a'; |
| 14 | } |
| 15 | } |
| 16 | } // namespace |
| 17 | |
| 18 | UUID UUID::Random() { |
| 19 | std::random_device rd; |
| 20 | std::mt19937 gen(rd()); |
| 21 | |
| 22 | std::uniform_int_distribution<> dis(0, 15); |
| 23 | std::uniform_int_distribution<> dis2(8, 11); |
| 24 | |
| 25 | UUID result; |
| 26 | |
| 27 | // UUID4 is implemented per https://www.cryptosys.net/pki/uuid-rfc4122.html |
| 28 | int i; |
| 29 | for (i = 0; i < 8; i++) { |
| 30 | result.data_[i] = ToHex(dis(gen)); |
| 31 | } |
| 32 | result.data_[i] = '-'; |
| 33 | ++i; |
| 34 | for (; i < 13; i++) { |
| 35 | result.data_[i] = ToHex(dis(gen)); |
| 36 | } |
| 37 | result.data_[i] = '-'; |
| 38 | ++i; |
| 39 | result.data_[i] = '4'; |
| 40 | ++i; |
| 41 | for (; i < 18; i++) { |
| 42 | result.data_[i] = ToHex(dis(gen)); |
| 43 | } |
| 44 | result.data_[i] = '-'; |
| 45 | ++i; |
| 46 | result.data_[i] = ToHex(dis2(gen)); |
| 47 | ++i; |
| 48 | for (; i < 23; i++) { |
| 49 | result.data_[i] = ToHex(dis(gen)); |
| 50 | } |
| 51 | result.data_[i] = '-'; |
| 52 | ++i; |
| 53 | for (; i < 36; i++) { |
| 54 | result.data_[i] = ToHex(dis(gen)); |
| 55 | } |
| 56 | |
| 57 | return result; |
| 58 | } |
| 59 | |
Brian Silverman | 1f34522 | 2020-09-24 21:14:48 -0700 | [diff] [blame^] | 60 | UUID UUID::Zero() { |
| 61 | UUID result; |
| 62 | result.data_.fill(0); |
| 63 | return result; |
| 64 | } |
| 65 | |
Austin Schuh | 64fab80 | 2020-09-09 22:47:47 -0700 | [diff] [blame] | 66 | } // namespace aos |