Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // UUID v4 Generator
- //
- #include <iostream>
- #include <cstdint>
- #include <random>
- #include <array>
- struct UUID
- {
- uint32_t a;
- uint16_t b;
- uint16_t c;
- std::array<uint8_t, 2> d;
- std::array<uint8_t, 6> e;
- };
- std::ostream& operator<<(std::ostream& stream, const UUID& object)
- {
- auto flags = stream.flags();
- stream << std::hex;
- stream.width(8);
- stream.fill('0');
- stream << object.a << "-";
- stream.width(4);
- stream.fill('0');
- stream << object.b << "-" << object.c << "-";
- for(auto i: object.d)
- {
- stream.width(2);
- stream.fill('0');
- stream << int(i);
- }
- stream << "-";
- for(auto i: object.e)
- {
- stream.width(2);
- stream.fill('0');
- stream << int(i);
- }
- stream.flags(flags);
- return stream;
- }
- class UUID4Generator
- {
- UUID4Generator() = delete;
- public:
- template<typename G>
- static UUID generate(G& generator)
- {
- auto result = UUID();
- auto rv_a = std::uniform_int_distribution<uint32_t>();
- result.a = rv_a(generator);
- auto rv_b = std::uniform_int_distribution<uint16_t>();
- result.b = rv_b(generator);
- auto rv_c = std::uniform_int_distribution<uint16_t>(0, 0x0FFF);
- result.c = rv_c(generator) | 0x4000;
- auto rv_d = std::uniform_int_distribution<uint8_t>();
- result.d[0] = (rv_d(generator) & 0x3F) | 0x80;
- result.d[1] = rv_d(generator);
- for(auto& i: result.e)
- {
- i = rv_d(generator);
- }
- return result;
- }
- };
- int main(void)
- {
- std::random_device rd;
- auto rnd = std::mt19937_64(rd());
- auto uuid = UUID4Generator::generate(rnd);
- std::cout << "UUID: " << uuid << std::endl;
- union { UUID uuid; std::array<int32_t, 4> d; } data = {uuid};
- std::cout << "Minecraft NBT: [I;" << int32_t(data.d[0]) << "," <<
- int32_t(data.d[1] >> 16 & 0xFFFF | data.d[1] << 16 & 0xFFFF0000) << "," <<
- int32_t(data.d[2] >> 24 & 0xFF | data.d[2] >> 8 & 0xFF00 | data.d[2] << 8 & 0xFF0000 | data.d[2] << 24 & 0xFF000000) << "," <<
- int32_t(data.d[3] >> 24 & 0xFF | data.d[3] >> 8 & 0xFF00 | data.d[3] << 8 & 0xFF0000 | data.d[3] << 24 & 0xFF000000) << "]" << std::endl;
- std::cout << "HEX: 0x" << std::hex << uint32_t(data.d[0]) <<
- uint32_t(data.d[1] >> 16 & 0xFFFF | data.d[1] << 16 & 0xFFFF0000) <<
- uint32_t(data.d[2] >> 24 & 0xFF | data.d[2] >> 8 & 0xFF00 | data.d[2] << 8 & 0xFF0000 | data.d[2] << 24 & 0xFF000000) <<
- uint32_t(data.d[3] >> 24 & 0xFF | data.d[3] >> 8 & 0xFF00 | data.d[3] << 8 & 0xFF0000 | data.d[3] << 24 & 0xFF000000) << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement