C++生成GUID码
.NET中生生成GUID(Globally Unique Identifier)比较简单
1 var uuid = Guid.NewGuid().ToString(); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12
2 var uuidN = Guid.NewGuid().ToString(“N”); // e0a953c3ee6040eaa9fae2b667060e09
3 var uuidD = Guid.NewGuid().ToString(“D”); // 9af7f46a-ea52-4aa3-b8c3-9fd484c2af12
4 var uuidB = Guid.NewGuid().ToString(“B”); // {734fd453-a4f8-4c5d-9c98-3fe2d7079760}
5 var uuidP = Guid.NewGuid().ToString(“P”); // (ade24d16-db0f-40af-8794-1e08e2040df3)
6 var uuidX = Guid.NewGuid().ToString(“X”); // {0x3fa412e3,0x8356,0x428f,{0xaa,0x34,0xb7,0x40,0xda,0xaf,0x45,0x6f}}
但是c++生成GUID码有两种方法:
- 一是使用windows自带的API,CoCreateGuid函数,不需要依赖其他库,缺点是无法夸平台,只能在windows平台上使用,代码如下:
//生成guid码
Include<objbase.h>
//CoCreateGuid在objbase头文件中
string GetHash()
{
string ret;
GUID guid;
HRESULT h = CoCreateGuid(&guid);//生成GUID码,HESULT是Com组件的一类返回值
if (h == S_OK)
ret = GuidToString(guid);//guid转化为string类型
else
throw runtime_error("generate guid failed!");
}
//Guid转化为的string
std::string GuidToString(const GUID& guid)
{
char buf[64] = { 0 };
sprintf_s(buf, sizeof(buf),
"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
guid.Data1, guid.Data2, guid.Data3,
guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
return std::string(buf);
}
- 使用Boost库生成GUID使用比较简单,就是要引入Boost库
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
boost::uuids::uuid uid = boost::uuids::random_generator()();
const string uid_str = boost::uuids::to_string(uid);
cout << uid_str << endl;
- GUID结构
GUID 的值表示为一系列小写的十六进制位,这些十六进制位分别以 8 个、4 个、4 个、4 个和 12 个位为一组并由连字符分隔开。 例如,返回值可以是“382c74c3-721d-4f34-80e5-57657b6cbc27”。