[C++]如何生成GUID

    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。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值