秋水之城

酒罢歌梁祝,情多付婵娟。

Linux & Windows上生成UUID/GUID

Linux & Windows上生成UUID/GUID


请见如下相关文章:

boost uuid

uuid in linux vs uuid in window[Parser]

各种OS中生成UUID的方法


GUID是微软对Distributed coumputing environment (DCE) universally unique identifier 的实现,而在Linux下则称作UUID。


通用的GUID的结构如下
typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;
举一个例子:
假设一个GUID的格式是这样的 6B29FC40-CA47-1067-B31D-00DD010662DA
其中Data1 是32位,可以看做8个四位十六进制数,对应于上面的6B29FC40
其中Data2 是16位,可以看做4个四位十六进制数,对应于上面的CA47
其中Data3 是16位,可以看做4个四位十六进制数,对应于上面的1067
其中Data4 比较特殊,是8个字节也就可以看做16个四位十六进制数
      取其Data4[0],Data4[1]来组成4个四位十六进制数,对应于上面的B31D
      取其Data4[2],Data4[3]来组成4个四位十六进制数,对应于上面的00DD
      取其Data4[4],Data4[5]来组成4个四位十六进制数,对应于上面的0106
      取其Data4[6],Data4[7]来组成4个四位十六进制数,对应于上面的62DA
*注意:四位十六进制数对应一个GUID字符。

具体代码:

#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;

#ifdef WIN32
#include <objbase.h>
#else
#include <uuid/uuid.h>
#endif

GUID CreateGuid()
{
    GUID guid;
#ifdef WIN32
    CoCreateGuid(&guid);
#else
    uuid_generate(reinterpret_cast<unsigned char *>(&guid));
#endif
    return guid;
}

std::string GuidToString(const GUID &guid)
{
    char buf[64] = {0};
#ifdef __GNUC__
    snprintf(
#else // MSVC
    _snprintf_s(
#endif
                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);
}

请注意:

windows下需要引用 ole32.lib

在linux下编译时需要链接uuid库(-luuid)

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ghlfllz/article/details/17128393
个人分类: C++
上一篇MySQL中获取当前查询的总记录数,适用于分页等应用
下一篇error:2014 Commands out of sync; you can't run this command now
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭