uuid P161
可以自定义一个头文件来使用uuid组件
//uuids.hpp #include <boost/uuid/uuid.hpp> #include <boost/uuid/uuid_generators.hpp> #include <boost/uuid/uuid_io.hpp> using namespace boost::uuids;
#include "uuids.hpp" using namespace boost::uuids; int main() { uuid u; //声明一个uuid对象 assert(uuid::static_size() == 16); //uuid的长度总是16 assert(u.size() == 16); vector<unsigned char> v(16,7); //一个vector对象 std::copy(v.begin(),v.end(),u.begin()); //使用标准拷贝算法 assert(u.data[0] == u.data[1] && u.data[15] == 7); //流输出:07070707-0707-0707-070707070707 cout<<u<<endl; std::fill_n(u.data+10, 6, 8); //流输出:07070707-0707-0707-080808080808 cout<<u<<endl; }
生成器 P165
- Nil生成器 -> 生成无效全零的UUID值
uuid u = nil_generator()(); //注意有两个括号 assert(u.is_nil()); u = nil_uuid(); assert(u.is_nil());
- 字符串生成器 -> string_generator //对字符串格式有严格要求
string_generator sgen; uuid u1 = sgen("0123456789abcdef0123456789abcdef"); cout<<u1<<endl; uuid u2 = sgen("01234567-89ab-cdef-0123-456789abcdef"); cout<<u1<<endl; uuid u3 = sgen(L"{01234567-89ab-cdef-0123-456789abcdef}"); cout<<u3<<endl;
- 名字生成器 -> name_generator //基于名字的SHA1摘要算法,需要指定基准UUID
//首先生成一个组织的UUID uuid www_xxx_com = string_generator()("{0123456789abcdef0123456789abcdef}"); name_generator ngen(www_xxx_com); uuid u1 = ngen("mario"); //为名字mario生成UUID assert(!u1.is_nil()&& //version是sha1算法 u1.version() == uuid::version_name_based_sha1); uuid u2 = ngen("link"); //为名字link生成UUID cout<<u2<<endl;
- 随机生成器 -> basic_random_generator
random_generator rgen; //随机生成器 uuid u = rgen(); //生成一个随机的UUID assert(u.version() == uuid::version_random_number_based); cout<<u<<endl;
增强的uuid类 P167
using namespace boost::uuids; class uuid_t: public uuid { private: static random_generator rgen; //随机数生成器 static string_generator sgen; //字符串生成器 public: uuid_t(): uuid(rgen()){} //缺省构造函数,生成随机UUID uuid_t(int): uuid(nil_uuid()) {} //0值的UUID构造函数 uuid_t(const char* str): uuid(sgen(str)) {} //字符串构造函数 uuid_t(const uuid& u, const char* str): //名字生成器构造函数 uuid(name_generator(u)(str)) {} explicit uuid_t(const uuid& u): uuid(u){} //拷贝构造函数 operator uuid() //转换到uuid类型 { return static_cast<uuid&>(*this); } operator uuid() const //常函数,转换到const uuid类型 { return static_cast<const uuid&>(*this); } }; random_generator uuid_t::rgen; //静态成员变量的定义 string_generator uuid_t::sgen; //使用 uuid_t u0 = 0; //0值的UUID assert(u0.is_nil()); uuid_t u1,u2; //创建两个随机的UUID值 cout<<u1<<endl; cout<<u2<<endl; uuid_t u3("{01234567-89ab-cdef-0123-456789abcdef}"); //字符串构造 cout << u3 <<endl; cout<<uuid_t(u3,"test name gen")<<endl; //通过名字构造
与字符串的转换
#include <boost/lexical_cast.hpp> using namespace boost; using namespace boost::uuids; int main() { uuid u = lexical_cast<uuid>("01234567-89ab-cdef-0123-456789abcdef"); cout<<u<<endl; string str = lexical_cast<string>(u); cout<<str<<endl; };