您的位置:首页 > 编程语言 > C语言/C++

[C++]如何生成GUID

2018-02-11 09:27 190 查看
    GUID(Globally Unique Identifier):全球唯一标识符,是一种由算法生成的字母数字标识符,长度为128位,在Windows平台上,GUID被广泛应用于注册表、数据库、接口标识以及自动生成的目录名称、机器名称等。
最近在项目开发中用到了以下两种方法生成GUID后转换成std::string类型作为map的Key,在此和大家分享一下!
1、使用CoCreateGuid函数#include "ObjBase.h"
#include "string"

using namespace std;

std::string GenerateGuid()
{
GUID guid;
CoCreateGuid(&guid);
char cBuffer[64] = {0};
sprintf_s(cBuffer, sizeof(cBuffer),
"{%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(cBuffer);
}

void main(int argc, char **argv)
{
std::string sGuid = GenerateGuid();
printf(sGuid.c_str());

system("pause");
return;
}注意:
    (1)使用CoCreateGuid函数需要添加 ObjBase.h 头文件
    (2)CoCreateGuid函数的原型为:HRESULT CoCreateGuid(GUID *pguid);
    (3)GUID的结构定义如下:typedef struct _GUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID;一个GUID总大小为4+2+2+8 = 16字节,格式为:"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", X表示0-9、a-f范围内的任意一位十六进制的数字,例如:3E456AB5-2C14-3D57-5FC3-0123BC54D34A。"5FC3"是Data4[0]和Data4[1], "0123BC54D34A"则是Data4[2]~Data4[7]。
2、使用random_generator函数#include <iostream>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>

using namespace std;

std::string GenerateGuid()
{
auto uidGen = boost::uuids::random_generator();
boost::uuids::uuid uid = uidGen();
std::stringstream sGuid;
sGuid << uid;
return sGuid.str();
}

void main(int argc, char **argv)
{
std::string sGuid = GenerateGuid();
cout << sGuid << endl;

system("pause");
return;
}注意:
    (1)UUID(University Unique Identifier), 别名GUID,位于名称空间boost::uuids中。

    (2)boost::uuids::uuid是一个很小的类,内部使用一个16字节的数组data存储UUID值,该数组为public属性,支持任意访问(拷贝或赋值等)。

    (3)数组data,类似于一个元素类型为unsigned char的容器,提供了begin()和end()的迭代器支持,可以操作UUID值的每个字节;提供了size()和static_size()方法,可以获得UUID值的长度,它是一个固定值16。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: