views:

2139

answers:

5

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.
+1  A: 

A GUID generator usually relies on hardware characteristics of the machine, usually stuff like MAC addresses or IPs. The only thing you can do which is absolutely platform independent is use some kind of PRNG seeded manually or seeded from some time source. This usually does not generate a true globally unique identifier in the sense that you are guaranteed that no one in the world generates the same number.

shoosh
+2  A: 

Simply using whatever guid/uuid is present on the target platform is best. Doing it right is hard (let's go shopping ;)).

The probability of a collision between any two identifiers from different but well executed implementations should be well beyond any reasonable chance of happening in this universe's lifetime.

ShuggyCoUk
if you want uniqueness in a 32 bit number (without co-operation) you have a problem. Partitioning the range and assigning them out as needed is about the only way...
ShuggyCoUk
+14  A: 

Recently Boost held the mini-review for the UUID library. It had been accepted, but there are few minor quirks to fix.

If you don't mind some reading the review itself can give quite a good overview of the UUID related problems and possible solutions.

Anonymous
This is exactly what I was hoping for. Thanks
Moses Schwartz
Reading the discussion and looking at the code I can't prevent the feeling that this is still very preliminary. In particular, the API *will* change and it lacks time-based UUID creation. That said, the approach is good and adaptable and the implementation is solid (except for one noted race cond.).
Konrad Rudolph
Yes, there were at least two follow up discussions - one of the issues related with interfaces, lexical_cast, etc, and the other was about PODness. I did not follow them.
Anonymous
Hi anon, these two issues (PODness and lex_cast) have both been resolved by now, and very elegantly. :-) Anyway, I'm very happy that you've posted this reference in the first place: I can and will make ample use of it. I'm confident that the outstanding issues will be resolved soon.
Konrad Rudolph
+1  A: 

Well one offbeat(?) solution would be to use a web service to get the GUID but I doubt this will be a good solution for a C++ program especially if it's not network enabled.

Here is a URL which might come in handy if you choose to pursue this option: http://www.hoskinson.net/GuidGenerator/default.asp

SDX2000
+1  A: 

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;
}
ubik