如何快速生成UUID 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,并以标准输出打印在控制台上。