4.10.2 用法
uuid是一个很小的类,目标是尽量简单,便于高效率地操作。因此它特意被设计为没有构造函数,可以像POD数据类型一样使用。
uuid内部使用一个16字节的数组data作为UUID值的存储,这个数组是public的,因此可以任意访问,比如拷贝或者赋值。基于data数组,uuid提供了begin()和end()的迭代器支持,可以像一个容器一样操作UUID值的每个字节。成员函数size()和静态成员函数static_size()可以获得UUID的长度,是一个固定值,总大小为16。因此,某种程度上可以把uuid看作是一个容量固定为16、元素类型为unsigned char的容器。
示范uuid容器用法的代码如下:
- #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-0707-070707070707
- cout << u << endl;
- std::fill_n(u.data+ 10,6, 8); //标准算法fill_n直接操纵数组
-
- //流输出:07070707-0707-0707-0707-080808080808
- cout << u << endl;
- }
uuid内部定义的枚举类型variant_type标识了UUID的变体号,表示了UUID的布局类型,成员函数variant()可以获得这个UUID的变体号。
UUID的生成有不同的算法,这些算法使用枚举version_type来标识,version()函数可以获得UUID的算法版本。uuid类可以识别现有的五种生成算法,分别是:
基于时间和MAC的算法(version_time_based);
分布计算环境算法(dce_security);
MD5摘要算法(version_name_based_md5);
随机数算法(version_random_number_based);
SHA1摘要算法(version_name_based_sha1)。
在数量庞大的UUID中有一个特殊的全零值nil,它表示一个无效的UUID,成员函数is_nil()可以检测uuid是否是nil。
示范uuid用于表示UUID用法的代码如下:
- uuid u ;
- std::fill_n(u.begin(), u.size(), 0xab); //直接填入0xab
- assert(!u.is_nil()); //不是无效UUID
- assert(u.variant() == u.variant_rfc_4122); //4122变体类型
- assert(u.version() == u.version_unknown); //生成算法未知
- cout << u << endl; //一串ab值
-
- std::memset(u.data, 0, 16); //可以使用memset操纵数组
- assert(u.is_nil()); //此时是一个无效的UUID
uuid还支持各种比较操作,例如:- uuid u1 ,u2; //两个uuid变量
-
- std::fill_n(u1.begin(), u1.size(), 0xab); //全0xab
- std::fill_n(u2.begin(), u2.size(), 0x10); //全0x10
- assert(u1 != u2 && u1 > u2); // u1 > u2
-
- u2.data[0] = 0xff; //u2的第一个字节改为0xff
- assert( u1 < u2); //此时u1 < u2
-
- std::memset(u1.data, 0, 16); //两个uuid都置为全0
- std::memset(u2.data, 0, 16);
- assert(u1 == u2); //两者相等