如何快速生成UUID GUID

通用GUID的结构如下

typedef struct _GUID {

DWORD data 1;

WORD Data2

WORD Data3

字节数据4[8];

} GUID

举个例子:

假设一个GUID的格式是6b 29 fc40-ca47-1067-b 31d-00dd 010662 da。

其中,Data1为32位,可视为8个四位十六进制数,对应上述6B29FC40。

其中Data2是16位,可以看成四个四位十六进制数,对应上面的CA47。

Data3是16位,可以看作是四个四位十六进制数,对应上面的1067。

其中Data4比较特殊,为8个字节,可以看作是16四位十六进制数。

取data4 [0]和data4 [1]组成四个四位十六进制数,对应上面的B31D。

取data4 [2]和data4 [3]组成四个四位十六进制数,对应上面的00DD。

取data4 [4]和data4 [5]组成四个四位十六进制数,对应上面的0106。

取data4 [6]和data4 [7]组成四个四位十六进制数,对应上面的62DA。

*注意:四个十六进制数字对应一个GUID字符。

Windows下提供了生成GUID的函数。需要使用头文件“objbase.h”,需要链接库ole32.lib。

HRESULT cocreate GUID(GUID * pguid);

在Linux下,需要先下载相应的库文件和头文件。

如果你是Debian用户,你可以通过apt命令轻松获取相关资源。

apt-get安装uuid-dev

安装完成后,您会发现

/usr/include/下有一个uuid文件夹,包含头文件uuid.h

/usr/lib/下有几个libuuid*链接库文件,包括静态和动态链接库。

打开uuid.h,你会发现一个uuid _ uuid_generate(uuid_t out)的函数声明。我们可以通过调用这个函数来生成UUID。

uuid _ generate(reinterpret _ cast & lt;无符号字符* & gt(& ampguid));

GUID容易生成吗?是的,因为我们不需要实现生成的算法,我们是站在前人的肩膀上,所以我们应该感谢他们。

下面是WINDOWS和LINUX下的通用程序。

// uuid_test.cpp

# include & lt字符串& gt

# include & ltstdio.h & gt

# include & ltiostream & gt

#包含" uuid_test.hpp "

#ifdef WIN32

# include & ltobjbase.h & gt

#否则

# include & ltuuid/uuid . h & gt;

#endif

使用命名空间std

命名空间ChinuxTeam

{

GUID CreateGuid()

{

GUID guid

#ifdef WIN32

CoCreateGuid(& amp;guid);

#否则

uuid _ generate(reinterpret _ cast & lt;无符号字符* & gt(& ampguid));

#endif

返回guid

}

string GUID tostring(const GUID & amp;guid)

{

char buf[64]= { 0 };

#ifdef __GNUC__

snprintf(

#否则// MSVC

_snprintf_s(

#endif

buf,

sizeof(buf),

" { % 08X-% 04X-% 04X-% 02X % 02X-% 02X % 02X % 02X % 02X % 02X % 02X } ",

guid。数据1,guid。数据2,guid。数据3,

guid。数据4[0],guid。数据4[1],

guid。数据4[2],guid。数据4[3],

guid。数据4[4],guid。数据4[5],

guid。数据4[6],guid。data 4[7]);

返回STD::string(buf);

}

}

相应的头文件

// uuid_test.hpp "

# include & lt字符串& gt

# include & ltstdio.h & gt

# include & ltiostream & gt

typedef struct _GUID

{

无符号长数据1;

无符号短数据2;

无符号短数据3;

无符号字符数据4[8];

} UUID GUID;

命名空间ChinuxTeam

{

GUID create GUID();

string GUID tostring(const GUID & amp;guid);

}//命名空间ChinuxTeam

最后一个GuidToString()稍微解释一下,它用于将GUIDs输出为固定格式的标准字符串String。

根据编译器的不同调用,调用不同的字符串打印函数。

附上一个简单的测试函数。

# include & lt字符串& gt

# include & ltstdio.h & gt

# include & ltiostream & gt

#ifdef WIN32

#包含“objbase.h”

#否则

typedef struct _GUID

{

无符号长数据1;

无符号短数据2;

无符号短数据3;

无符号字符数据4[8];

} UUID GUID;

#endif

命名空间ChinuxTeam{

GUID create GUID();

string GUID tostring(const GUID & amp;guid);

}

运行后,将生成一个GUID,并以标准输出打印在控制台上。