首页 > 代码库 > uuid 学习

uuid 学习

#include <vector>
#include <iostream>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
using namespace boost::uuids;
using namespace std;
int main()
{
	//-------------------------
	// 一些std函数的应用
	//-------------------------
	vector<unsigned int> v(16, 7);
	uuid u;
	std::copy(v.begin(), v.end(), u.begin());	// 将一个序列复制到另一个序列中(从begin到end)
	std::fill_n(u.data + 2, 6, 8);				// 将数组第二个序列号后的6个值赋为8
	cout <<"/n u first print:" <<u<<endl;
	std::memset(u.data, 0, u.size());			// 将数组中的所有元素都置零
	cout <<"UUID is empty:"<<u.is_nil()<<endl;  // 是否全零
	cout <<"u second print:" <<u<<endl;			// 再次输输出
	//--------------------------
	// uuid的比较(字典序1~9,a~z排序)
	//--------------------------
	uuid u1, u2;
	std::fill_n(u1.begin(), u1.size(), 0xab);	// 从第位开始始,后面size()位都赋成0xab
	std::fill_n(u2.begin(), u2.size(), 0x10);
	cout <<"uuid1:"<<u1<<endl<<"uuid2:"<<u2<<endl;
	(u1>=u2)?cout<<"uuid1 is Max equal to uuid2/n":cout<<"uuid2 is Max to uuid1/n";
	//--------------------------
	// UUID 的几种生成器,它们都是函数对象
	//--------------------------
	// 第一种: 
	// Nil生成器(生成一个全零/无效的UUID/is_nil)
	uuid nilUUID1 = nil_generator()();			// 第一个括号是构造函数,第二个是调用重载操作符(operator())
	uuid nilUUID2 = nil_uuid();					// 内联函数
	cout<< "nilUUID1: "<<nilUUID1<<endl;
	cout<< "nilUUID2: "<<nilUUID2<<endl;
	// 第二种:
	// 字符串生成器(可是c数组,string,wstring,或迭代器指定的字符串区间)
	string_generator sgen;
	uuid strUUID1 = sgen("0123456789abcdef0123456789uvwxyz");		// 没有隔线分开,uvwxyz会变成ffffff
	uuid strUUID2 = sgen("01234567-89ab-cdef-0123-456789abcdef"); // 有分隔,分隔不能乱隔
	uuid strUUID3 = sgen(L"{01234567-89ab-cdef-0123-456789abcdef}"); // 使用"{}"括起来除{}外不能有16进制外的任何字符
	cout << "strUUID1 value: "<<strUUID1<<endl;
	cout << "strUUID2 value: "<<strUUID2<<endl;
	cout << "strUUID3 value: "<<strUUID3<<endl;
	// 第三种:
	// 名字生成器(参数可以是16进制字符外的字符)
	uuid baseUUID = sgen(L"{01234567-89ab-cdef-0123-456789abcdef}");
	name_generator ngen(baseUUID);			// 构造名字生成器,需要一个基准uuid,
											// 只要基准uuid不变,相同字符串总产生相同的uuid
	uuid nameUUID1 = ngen("Ajiaxi");		// 为Ajiaxi生成一个UUID, version是shal算法
	uuid nameUUID2 = ngen("Link");			// 为Link生成一个UUID
	cout << "nameUUID1 value: "<<nameUUID1<<endl;
	cout << "nameUUID2 value: "<<nameUUID2<<endl;
	// 第四种:
	// 随机生成器(使用boost::random生成随机种子)
	random_generator rgen;
	uuid ranUUID = rgen();					// 生成一个随机uuid
	cout << "ranUUID value: "<<ranUUID<<endl;
	getchar();
	return 0;
}


Windows:使用CoCreateGuid函数(GUID)

[cpp] view plaincopyprint?
  1. #include <objbase.h>  
  2. #include <stdio.h>  
  3.   
  4. #define GUID_LEN 64  
  5.   
  6. int main(int argc, char* argv[])  
  7. {  
  8.     char buffer[GUID_LEN] = { 0 };  
  9.     GUID guid;  
  10.   
  11.     if ( CoCreateGuid(&guid) )  
  12.     {  
  13.         fprintf(stderr, "create guid error\n");  
  14.         return -1;  
  15.     }  
  16.     _snprintf(buffer, sizeof(buffer),   
  17.         "%08X-%04X-%04x-%02X%02X-%02X%02X%02X%02X%02X%02X",   
  18.         guid.Data1, guid.Data2, guid.Data3,   
  19.         guid.Data4[0], guid.Data4[1], guid.Data4[2],   
  20.         guid.Data4[3], guid.Data4[4], guid.Data4[5],   
  21.         guid.Data4[6], guid.Data4[7]);  
  22.     printf("guid: %s\n", buffer);  
  23.   
  24.     return 0;  
  25. }  

Linux:使用uuid_generate函数(UUID)
[cpp] view plaincopyprint?
  1. //编译命令:gcc atemp.c -o atemp -luuid  
  2. #include <stdio.h>  
  3. #include <uuid/uuid.h>  
  4.   
  5. int main()   
  6. {   
  7.     uuid_t uu;  
  8.     int i;  
  9.     uuid_generate( uu );   
  10.   
  11.     for(i=0;i<16;i++)   
  12.     {   
  13.         printf("%02X-",uu[i]);   
  14.     }   
  15.     printf("\n");   
  16.   
  17.     return 0;   
  18. }   

uuid 学习