Platform-independent GUID generation in C++?
What is the best way to programmatically generate a GUID or UUID in C++ without relying on a platform-specific tool? I am trying to make unique identifiers for objects in a simulation, but can't rely on Microsoft's implementation as the project is cross-platform.
Notes:
- Since this is for a simulator, I don't really need cryptographic randomness.
- It would be best if this is a 32 bit number.
If you can afford to use Boost, then there is a UUID library that should do the trick. It's very straightforward to use - check the documentation and this answer.
on linux: man uuid
on win: check out for UUID structure and UuidCreate function in msdn
[edit] the function would appear like this
extern "C"
{
#ifdef WIN32
#include <Rpc.h>
#else
#include <uuid/uuid.h>
#endif
}
std::string newUUID()
{
#ifdef WIN32
UUID uuid;
UuidCreate ( &uuid );
unsigned char * str;
UuidToStringA ( &uuid, &str );
std::string s( ( char* ) str );
RpcStringFreeA ( &str );
#else
uuid_t uuid;
uuid_generate_random ( uuid );
char s[37];
uuid_unparse ( uuid, s );
#endif
return s;
}
If you cannot afford to use Boost, then there is a very minimal library that I implemented which simply acts as a wrapper around each operating system's native guid implementation. It should work on Windows (using CoCreateGuid
), Linux (using libuuid
), MacOS (using CFUUID
), iOS (also using CFUUID
), and Android (using JNI calls to java.util.UUID
). The guid generation function has a different implementation on each system but there is single generic implementation for comparing, stringifying, and parsing.
It is MIT licensed and available on GitHub:
https://github.com/graeme-hill/crossguid