cat /proc/sys/kernel/random/uuid 为什么能得到

如题所述

  通用的GUID的结构如下  typedefstruct_GUID{  DWORDData1;  WORDData2;  WORDData3;  BYTEData4[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字符。  在Windows下提供了一个函数可以生成一个GUID。需要使用的头文件"objbase.h",需要链接的库ole32.lib。  HRESULTCoCreateGuid(GUID*pguid);  在Linux下首先需要下载到相应的库文件和头文件  如果是Debian用户可以方便的通过apt命令来获取相关资源。  apt-getinstalluuid-dev  安装完成后会发现  在/usr/include/下有一个uuid文件夹,其中则包含了uuid.h头文件。  在/usr/lib/下有几个libuuid*的链接库文件,包括静态和动态链接库。  打开uuid.h你会发现有一个uuid_generate(uuid_tout)的函数声明。我们可以通过调用这个函数来生成UUID。  uuid_generate(reinterpret_cast(&guid));  生成GUID是不是很简单!是的,因为生成的算法不用我们去实现,我们是站在前人的肩膀所以我们要感谢他们。  下面给出一个WINDOWS和LINUX下通用的程序。  //uuid_test.cpp  #include  #include  #include  #include"uuid_test.hpp"  #ifdefWIN32  #include  #else  #include  #endif  usingnamespacestd;  namespaceChinuxTeam  {  GUIDCreateGuid()  {  GUIDguid;  #ifdefWIN32  CoCreateGuid(&guid);  #else  uuid_generate(reinterpret_cast(&guid));  #endif  returnguid;  }  std::stringGuidToString(constGUID&guid)  {  charbuf[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]);  returnstd::string(buf);  }  }  对应的头文件  //uuid_test.hpp"  #include  #include  #include  typedefstruct_GUID  {  unsignedlongData1;  unsignedshortData2;  unsignedshortData3;  unsignedcharData4[8];  }GUID,UUID;  namespaceChinuxTeam  {  GUIDCreateGuid();  std::stringGuidToString(constGUID&guid);  }//namespaceChinuxTeam
  最后一个GuidToString()稍微解释一下,作用就是把GUID以固定的格式输出到标准string字符串中,  根据编译器的不同调用分别调用了不同的字符串打印函数。
  另外附一个简单的测试函数
  #include  #include  #include  #ifdefWIN32  #include"objbase.h"  #else  typedefstruct_GUID  {  unsignedlongData1;  unsignedshortData2;  unsignedshortData3;  unsignedcharData4[8];  }GUID,UUID;  #endif  namespaceChinuxTeam{  GUIDCreateGuid();  std::stringGuidToString(constGUID&guid);  }  运行后会生成一个GUID并打印到标准输出的控制台上。
温馨提示:答案为网友推荐,仅供参考
相似回答