UUID has been updated to use a better hash and no unnecessary allocations (Big thanks to mosra!)

This commit is contained in:
2026-01-31 13:45:15 +02:00
parent ff062567d8
commit edb0055224
2 changed files with 17 additions and 54 deletions

View File

@@ -13,57 +13,27 @@
#include <cstdint>
#include <cstring>
#include <format>
#include <memory>
#include <string>
using namespace Tourmaline::Type;
std::string UUID::asString() const {
return std::format("{:016X}{:016X}", data[0], data[1]);
return std::format("{:016X}{:016X}", firstHalf, secondHalf);
}
bool UUID::operator==(const UUID &rhs) const {
// Since size may be increased
for (uint8_t index = 0; index < QWORDLength; index++) {
if (this->data[index] != rhs.data[index]) {
return false;
}
}
return true;
return firstHalf == rhs.firstHalf && secondHalf == rhs.secondHalf;
}
UUID::UUID(const UUID &uuid) {
std::memcpy(data.get(), uuid.data.get(), UUID::ByteLength);
}
UUID &UUID::operator=(const UUID &uuid) {
if (this != &uuid) [[likely]] {
std::memcpy(data.get(), uuid.data.get(), UUID::ByteLength);
}
return *this;
}
UUID &UUID::operator=(UUID &&uuid) {
if (this != &uuid) [[likely]] {
data.swap(uuid.data);
}
return *this;
}
UUID::UUID(UUID &&uuid) noexcept { data.swap(uuid.data); }
UUID::UUID(uint64_t firstHalf, uint64_t secondHalf) {
data[0] = firstHalf;
data[1] = secondHalf;
}
UUID::UUID(uint64_t firstHalf, uint64_t secondHalf)
: firstHalf(firstHalf), secondHalf(secondHalf) {}
UUID::UUID(const std::string &uuid) {
// We are assuming that it is a valid UUID, if not then somewhere else this
// UUID should cause an error
auto start = uuid.c_str(), half = start + ByteLength,
tail = half + ByteLength; // Each UUID element is 16 characters padded
auto start = uuid.c_str(), half = start + 16,
tail = half + 16; // Each UUID element is 16 characters padded
std::from_chars(start, half, data[0], 16);
std::from_chars(half, tail, data[1], 16);
std::from_chars(start, half, firstHalf, 16);
std::from_chars(half, tail, secondHalf, 16);
}