Appearance
Generate UUID in C++
C++ doesn't have built-in UUID support, but you can use the Boost.UUID library, which is the most popular and comprehensive solution:
cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>
int main() {
// Generate UUID version 4 - random
boost::uuids::random_generator gen;
boost::uuids::uuid uuid = gen();
std::cout << "Generated UUID: " << uuid << std::endl;
return 0;
}
For generating specific UUID versions, Boost.UUID provides comprehensive support:
cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/name_generator.hpp>
#include <iostream>
#include <string>
int main() {
// Generate UUID version 1 - time based (if available)
try {
boost::uuids::basic_random_generator<boost::mt19937> gen;
boost::uuids::uuid uuid1 = gen();
std::cout << "UUID v1: " << uuid1 << std::endl;
} catch (const std::exception& e) {
std::cout << "UUID v1 not available: " << e.what() << std::endl;
}
// Generate UUID version 3 - deterministic and hashed with MD5
boost::uuids::name_generator_md5 gen3(boost::uuids::ns::url());
boost::uuids::uuid uuid3 = gen3("https://example.com");
std::cout << "UUID v3: " << uuid3 << std::endl;
// Generate UUID version 4 - random
boost::uuids::random_generator gen4;
boost::uuids::uuid uuid4 = gen4();
std::cout << "UUID v4: " << uuid4 << std::endl;
// Generate UUID version 5 - deterministic and hashed with SHA-1
boost::uuids::name_generator_sha1 gen5(boost::uuids::ns::url());
boost::uuids::uuid uuid5 = gen5("https://example.com");
std::cout << "UUID v5: " << uuid5 << std::endl;
return 0;
}
Installation & Setup
Using vcpkg (Recommended):
bash
vcpkg install boost-uuid
Using Conan:
bash
conan install boost/1.82.0@
Manual Installation:
bash
# Download and build Boost
wget https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.gz
tar -xzf boost_1_82_0.tar.gz
cd boost_1_82_0
./bootstrap
./b2 --with-uuid
CMake Integration:
cmake
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(UUIDExample)
set(CMAKE_CXX_STANDARD 17)
find_package(Boost REQUIRED COMPONENTS uuid)
add_executable(uuid_example main.cpp)
target_link_libraries(uuid_example ${Boost_LIBRARIES})
target_include_directories(uuid_example PRIVATE ${Boost_INCLUDE_DIRS})
Advanced C++ UUID Usage
UUID Utility Class:
cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/name_generator.hpp>
#include <boost/lexical_cast.hpp>
#include <string>
#include <stdexcept>
class UUIDGenerator {
private:
static boost::uuids::random_generator random_gen;
static boost::uuids::name_generator_md5 md5_gen;
static boost::uuids::name_generator_sha1 sha1_gen;
public:
// Generate UUID version 4 - random
static std::string generateV4() {
return boost::lexical_cast<std::string>(random_gen());
}
// Generate UUID version 3 - MD5 namespace
static std::string generateV3(const std::string& name,
const boost::uuids::uuid& namespace_uuid = boost::uuids::ns::url()) {
boost::uuids::name_generator_md5 gen(namespace_uuid);
return boost::lexical_cast<std::string>(gen(name));
}
// Generate UUID version 5 - SHA1 namespace
static std::string generateV5(const std::string& name,
const boost::uuids::uuid& namespace_uuid = boost::uuids::ns::url()) {
boost::uuids::name_generator_sha1 gen(namespace_uuid);
return boost::lexical_cast<std::string>(gen(name));
}
// Parse UUID from string
static boost::uuids::uuid parse(const std::string& uuid_str) {
try {
return boost::lexical_cast<boost::uuids::uuid>(uuid_str);
} catch (const boost::bad_lexical_cast& e) {
throw std::invalid_argument("Invalid UUID format: " + uuid_str);
}
}
// Validate UUID string
static bool isValid(const std::string& uuid_str) {
try {
parse(uuid_str);
return true;
} catch (const std::invalid_argument&) {
return false;
}
}
};
// Static member definitions
boost::uuids::random_generator UUIDGenerator::random_gen;
boost::uuids::name_generator_md5 UUIDGenerator::md5_gen(boost::uuids::ns::url());
boost::uuids::name_generator_sha1 UUIDGenerator::sha1_gen(boost::uuids::ns::url());
// Usage example
int main() {
std::cout << "UUID v4: " << UUIDGenerator::generateV4() << std::endl;
std::cout << "UUID v3: " << UUIDGenerator::generateV3("example.com") << std::endl;
std::cout << "UUID v5: " << UUIDGenerator::generateV5("example.com") << std::endl;
std::string uuid_str = UUIDGenerator::generateV4();
std::cout << "Valid UUID: " << std::boolalpha << UUIDGenerator::isValid(uuid_str) << std::endl;
return 0;
}
Modern C++17/20 Usage:
cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>
#include <optional>
#include <string_view>
class ModernUUIDGenerator {
public:
using UUID = boost::uuids::uuid;
// C++17 structured bindings support
static auto generateWithMetadata() {
auto uuid = boost::uuids::random_generator{}();
auto timestamp = std::chrono::system_clock::now();
return std::make_tuple(uuid, timestamp);
}
// C++17 optional for safe parsing
static std::optional<UUID> tryParse(std::string_view uuid_str) noexcept {
try {
return boost::lexical_cast<UUID>(std::string(uuid_str));
} catch (...) {
return std::nullopt;
}
}
// C++20 concepts (if available)
template<typename T>
requires std::convertible_to<T, std::string>
static UUID generateFromName(T&& name) {
boost::uuids::name_generator_sha1 gen(boost::uuids::ns::url());
return gen(std::forward<T>(name));
}
};
int main() {
// C++17 structured bindings
auto [uuid, timestamp] = ModernUUIDGenerator::generateWithMetadata();
std::cout << "UUID: " << uuid << std::endl;
// C++17 optional usage
if (auto parsed = ModernUUIDGenerator::tryParse("invalid-uuid")) {
std::cout << "Parsed: " << *parsed << std::endl;
} else {
std::cout << "Failed to parse UUID" << std::endl;
}
return 0;
}
Thread-Safe UUID Generation:
cpp
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <thread>
#include <mutex>
#include <vector>
#include <iostream>
class ThreadSafeUUIDGenerator {
private:
static std::mutex mtx;
static boost::uuids::random_generator gen;
public:
static std::string generate() {
std::lock_guard<std::mutex> lock(mtx);
return boost::lexical_cast<std::string>(gen());
}
};
std::mutex ThreadSafeUUIDGenerator::mtx;
boost::uuids::random_generator ThreadSafeUUIDGenerator::gen;
void generateUUIDs(int count) {
for (int i = 0; i < count; ++i) {
std::cout << "Thread " << std::this_thread::get_id()
<< ": " << ThreadSafeUUIDGenerator::generate() << std::endl;
}
}
int main() {
std::vector<std::thread> threads;
// Create multiple threads
for (int i = 0; i < 4; ++i) {
threads.emplace_back(generateUUIDs, 3);
}
// Wait for all threads to complete
for (auto& t : threads) {
t.join();
}
return 0;
}
Platform-Specific Alternatives
Windows (without Boost):
cpp
#include <windows.h>
#include <rpc.h>
#include <iostream>
#include <string>
#pragma comment(lib, "rpcrt4.lib")
std::string generateWindowsUUID() {
UUID uuid;
UuidCreate(&uuid);
RPC_CSTR uuidStr;
UuidToStringA(&uuid, &uuidStr);
std::string result(reinterpret_cast<char*>(uuidStr));
RpcStringFreeA(&uuidStr);
return result;
}
int main() {
std::cout << "Windows UUID: " << generateWindowsUUID() << std::endl;
return 0;
}
Linux (using libuuid):
cpp
#include <uuid/uuid.h>
#include <iostream>
#include <string>
std::string generateLinuxUUID() {
uuid_t uuid;
uuid_generate(uuid);
char uuid_str[37];
uuid_unparse(uuid, uuid_str);
return std::string(uuid_str);
}
int main() {
std::cout << "Linux UUID: " << generateLinuxUUID() << std::endl;
return 0;
}
UUID Version Comparison
Choose the right version for your C++ application:
- Version 1 - Time-based, includes MAC address
- Version 3 - MD5 namespace-based, deterministic
- Version 4 - Random, most popular choice
- Version 5 - SHA-1 namespace-based, more secure than v3
- Version 6 - Time-ordered, better than v1 for databases
- Version 7 - Modern time-based with improved sorting
For C++ applications:
- Game engines: Use Version 4 for entity and asset identification
- Real-time systems: Consider Version 1 for precise timing requirements
- Database applications: Use Version 6 for optimal indexing performance
How do I generate UUID in other languages?
Systems programming:
High-level languages:
- JavaScript - crypto.randomUUID() & uuid library
- Python - Built-in uuid module
- Java - java.util.UUID & UuidCreator
- C# - System.Guid & UuidCreator