Boost 1.42新库速递——UUID

来源:互联网 发布:中国商业源码网 编辑:程序博客网 时间:2024/05/23 12:59

引言

UUID(Universally unique identifier,通用唯一识别码),可在无签名中心的分布式环境中得到唯一标识。它可以用来标记生命期很短的对象,也可以可靠地识别在网络上长时间存在的持久对象。

UUID有很多方面的应用。举一些例子:数据库可以使用的UUID来识别行或记录,以确保他们可以在不同的数据库中保持唯一性,或者用于出版/订 阅服务。网络消息可以用UUID标识,以确保消息的不同部分可以正确地重新组合起来。分布式计算可以用UUID来识别远程过程调用。基于序列化的事务和分 类可以用UUID识别。微软的组件对象模型(COM)使用UUID来区分不同的软件组件接口。UUID被插入到Microsoft Office的文档中。UUID标识高级系统格式(ASF)的音频或视频流。UUID也是OID(对象标识符)和URN(统一资源名称)的基础。

UUID和其它替代品相比,最有吸引力的一个特点是相对较小:128位或16字节。另一个原因是,创造UUID不需要一个中央机构。

当UUID从一个机器上生成时,它们保证是唯一的(即,这个UUID之前从未生成过而且以后也不会生成),或者它极可能是唯一的(由机制而定)。

示例代码

标记

  1. // 用uuid标识对象的例子
  2. // 参考 boost/libs/uuid/test/test_tagging.cpp
  3.  
  4. #include <boost/uuid/uuid.hpp>
  5. #include <boost/uuid/uuid_generators.hpp>
  6.  
  7. class object
  8. {
  9. public:
  10.     object()
  11.         : tag(boost::uuids::random_generator()())
  12.         , state(0)
  13.     {}
  14.     
  15.     explicit object(int state)
  16.         : tag(boost::uuids::random_generator()())
  17.         , state(state)
  18.     {}
  19.     
  20.     object(object const& rhs)
  21.         : tag(rhs.tag)
  22.         , state(rhs.state)
  23.     {}
  24.     
  25.     bool operator==(object const& rhs) const {
  26.         return tag == rhs.tag;
  27.     }
  28.     
  29.     object& operator=(object const& rhs) {
  30.         tag = rhs.tag;
  31.         state = rhs.state;
  32.     }
  33.     
  34.     int get_state() const { return state; }
  35.     void set_state(int new_state) { state = new_state; }
  36.     
  37. private:
  38.     boost::uuids::uuid tag;
  39.     
  40.     int state;
  41. };
  42.  
  43. object o1(1);
  44. object o2 = o1;
  45. o2.set_state(2);
  46. assert(o1 == o2);
  47.  
  48. object o3(3);
  49. assert(o1 != o3);
  50. assert(o2 != o3);

POD(Plain Old Data)风格

这个库把UUID实现为类似于POD数据,这样我们就有很多高效的方法应用它,包括memcpy和初始化器。缺点是POD没有构造函数,因此声明UUID时不会默认生成一个有效值。不过定义一个基于UUID的类可以解决这个问题。

  1. // 使用memcpy和初始化器的例子
  2. // uuid类的例子请参考boost/libs/uuid/test/test_uuid_class.cpp
  3.  
  4. #include <boost/uuid/uuid.hpp>
  5. #include <boost/uuid/uuid_generators.hpp>
  6.  
  7. // 使用memcpy的例子
  8.     unsigned char uuid_data[16];
  9.     // 填充uuid_data
  10.  
  11.     boost::uuids::uuid u;
  12.  
  13.     memcpy(&u, uuid_data, 16);
  14. }
  15.  
  16. // 使用初始化器的例子
  17.     boost::uuids::uuid u =
  18.     { 0x12 ,0x34, 0x56, 0x78
  19.     , 0x90, 0xab
  20.     , 0xcd, 0xef
  21.     , 0x12, 0x34
  22.     , 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef
  23.     };
  24. }
  25.  
  26. // 建立一个uuid类的例子
  27. // 使用默认机制在构造时初始化一个值
  28.  
  29. class uuid_class : public boost::uuids::uuid
  30. {
  31. public:
  32.     uuid_class()
  33.         : boost::uuids::uuid(boost::uuids::random_generator()())
  34.     {}
  35.     
  36.     explicit uuid_class(boost::uuids::uuid const& u)
  37.         : boost::uuids::uuid(u)
  38.     {}
  39.  
  40.     operator boost::uuids::uuid() {
  41.         return static_cast<boost::uuids::uuid&>(*this);
  42.     }
  43.  
  44.     operator boost::uuids::uuid() const {
  45.         return static_cast<boost::uuids::uuid const&>(*this);
  46.     }
  47. };
  48.  
  49. uuid_class u1;
  50. uuid_class u2;
  51.  
  52. assert(u1 != u2);

字节提取

有时直接取得uuid的16字节是有用的。典型用法如下:

  1. boost::uuids::uuid u;
  2. std::vector<char> v(u.size());
  3. std::copy(u.begin(), u.end(), v.begin());

注:boost::uuids::uuid::size()总是返回16。

0 0
原创粉丝点击