Foundation
Loading...
Searching...
No Matches
UUID.hpp
Go to the documentation of this file.
1#pragma once
2#include <cstdint>
3#include <functional>
4#include <string_view>
5#include "Hash.hpp"
6
7namespace Foundation::Core {
8 // http://www.jstatsoft.org/v08/i14/paper
10 {
11 public:
12 XorShift128(uint64_t seed) noexcept { Reseed(seed); }
13 XorShift128(uint64_t s0, uint64_t s1) noexcept { Reseed(s0, s1); }
14 void Reseed(uint64_t seed) noexcept;
15 // Seeds all 128 bits of state from two independent entropy words.
16 void Reseed(uint64_t s0, uint64_t s1) noexcept;
17 uint64_t Next() noexcept;
18
19 private:
20 uint64_t _x{ 0x9E3779B97F4A7C15ull };
21 uint64_t _y{ 0xBF58476D1CE4E5B9ull };
22 uint64_t _z{ 0x94D049BB133111EBull };
23 uint64_t _w{ 0xFF51AFD7ED558CCDull };
24 };
25
34 struct FUUID
35 {
36 uint64_t hi{0};
37 uint64_t lo{0};
38
39 [[nodiscard]] bool IsNil() const noexcept { return hi == 0 && lo == 0; }
40
41 friend bool operator==(FUUID, FUUID) noexcept = default;
42 friend bool operator!=(FUUID, FUUID) noexcept = default;
43 friend bool operator<(FUUID a, FUUID b) noexcept { return a.hi != b.hi ? a.hi < b.hi : a.lo < b.lo; }
44 friend bool operator>(FUUID a, FUUID b) noexcept { return b < a; }
45 friend bool operator<=(FUUID a, FUUID b) noexcept { return !(b < a); }
46 friend bool operator>=(FUUID a, FUUID b) noexcept { return !(a < b); }
47
48 [[nodiscard]] static FUUID Generate();
49 [[nodiscard]] static FUUID FromBytes(const void* data, size_t size);
50 [[nodiscard]] static FUUID FromString(std::string_view s) { return FromBytes(s.data(), s.size()); }
51
52 // RFC 9562 canonical 8-4-4-4-12 lowercase hex; writes "nil" when @ref IsNil().
53 [[nodiscard]] char const* Format(char* buf, size_t bufSize) const noexcept;
54 };
55
56 static constexpr FUUID kNilUUID{};
57
58} // namespace Foundation::Core
59
60template <>
61struct std::hash<Foundation::Core::FUUID>
62{
63 size_t operator()(Foundation::Core::FUUID const& id) const noexcept
64 {
65 return static_cast<size_t>(Foundation::Core::FNV1a64(id.hi, id.lo));
66 }
67};
Definition UUID.hpp:10
uint64_t _w
Definition UUID.hpp:23
uint64_t _z
Definition UUID.hpp:22
XorShift128(uint64_t seed) noexcept
Definition UUID.hpp:12
uint64_t Next() noexcept
Definition UUID.cpp:56
uint64_t _x
Definition UUID.hpp:20
uint64_t _y
Definition UUID.hpp:21
void Reseed(uint64_t seed) noexcept
Definition UUID.cpp:41
XorShift128(uint64_t s0, uint64_t s1) noexcept
Definition UUID.hpp:13
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:6
static constexpr FUUID kNilUUID
Definition UUID.hpp:56
constexpr uint64_t FNV1a64(Span< const T > span) noexcept
Definition Container.hpp:509
Definition Allocator.hpp:6
128-bit identifier. Two flavors, both well-formed per RFC 9562:
Definition UUID.hpp:35
bool IsNil() const noexcept
Definition UUID.hpp:39
uint64_t lo
Definition UUID.hpp:37
static FUUID FromString(std::string_view s)
Definition UUID.hpp:50
static FUUID Generate()
Definition UUID.cpp:85
static FUUID FromBytes(const void *data, size_t size)
Definition UUID.cpp:15
friend bool operator<=(FUUID a, FUUID b) noexcept
Definition UUID.hpp:45
friend bool operator>=(FUUID a, FUUID b) noexcept
Definition UUID.hpp:46
friend bool operator>(FUUID a, FUUID b) noexcept
Definition UUID.hpp:44
char const * Format(char *buf, size_t bufSize) const noexcept
Definition UUID.cpp:91
friend bool operator==(FUUID, FUUID) noexcept=default
friend bool operator<(FUUID a, FUUID b) noexcept
Definition UUID.hpp:43
friend bool operator!=(FUUID, FUUID) noexcept=default
uint64_t hi
Definition UUID.hpp:36
size_t operator()(Foundation::Core::FUUID const &id) const noexcept
Definition UUID.hpp:63