Introduction
The GUID generator GuidGen.exe provided by VC can only generate random GUID. This tool can generate GUID base on a string
such as class name. This means one class name maps to one GUID.
Background
RFC 4122 described the algorithm for creating a Name-Based UUID.
http://www.ietf.org/rfc/rfc4122.txt
The requirements for these types of UUIDs are as follows:
- The UUIDs generated at different times from the same name in the same namespace MUST be equal.
- The UUIDs generated from two different names in the same namespace should be different (with very high probability).
- The UUIDs generated from the same name in two different namespaces should be different with (very high probability).
- If two UUIDs that were generated from names are equal, then they were generated from the same name in the same namespace (with very high probability).
The algorithm for generating a UUID from a name and a namespace are as follows:
- Allocate a UUID to use as a "name space ID" for all UUIDs generated from names in that namespace; see Appendix C for some pre-defined values.
- Choose either MD5 [4] or SHA-1 [8] as the hash algorithm; If backward compatibility is not an issue, SHA-1 is preferred.
Using the Code
I used the sample implementation code from the RFC 4122 document and I fixed the code to let it use openssl
implementation of SHA1.
#include <openssl/crypto.h>
#include <openssl/md5.h>
#include <openssl/sha.h>
It uses SHA1 to generate UUID:
uuid_create_sha1_from_name(&id, NameSpace_DNS, ss, length);
You can change it to use MD5 easily:
uuid_create_md5_from_name(&id, NameSpace_DNS, ss, length);
To build the source code, you need to download openssl from http://openssl.org, and build it as its guide.
Or you can just use the demo tool, it requires .NET Framework runtime.
History
- 27th July, 2006: Initial post