引言
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之前从未生成过而且以后也不会生成),或者它极可能是唯一的(由机制而定)。
示例代码
标记
- // 用uuid标识对象的例子
- // 参考 boost/libs/uuid/test/test_tagging.cpp
- #include <boost/uuid/uuid.hpp>
- #include <boost/uuid/uuid_generators.hpp>
- class object
- {
- public:
- object()
- : tag(boost::uuids::random_generator()())
- , state(0)
- {}
- explicit object(int state)
- : tag(boost::uuids::random_generator()())
- , state(state)
- {}
- object(object const& rhs)
- : tag(rhs.tag)
- , state(rhs.state)
- {}
- bool operator==(object const& rhs) const {
- return tag == rhs.tag;
- }
- object& operator=(object const& rhs) {
- tag = rhs.tag;
- state = rhs.state;
- }
- int get_state() const { return state; }
- void set_state(int new_state) { state = new_state; }
- private:
- boost::uuids::uuid tag;
- int state;
- };
- object o1(1);
- object o2 = o1;
- o2.set_state(2);
- assert(o1 == o2);
- object o3(3);
- assert(o1 != o3);
- assert(o2 != o3);
POD(Plain Old Data)风格
这个库把UUID实现为类似于POD数据,这样我们就有很多高效的方法应用它,包括memcpy和初始化器。缺点是POD没有构造函数,因此声明UUID时不会默认生成一个有效值。不过定义一个基于UUID的类可以解决这个问题。
- // 使用memcpy和初始化器的例子
- // uuid类的例子请参考boost/libs/uuid/test/test_uuid_class.cpp
- #include <boost/uuid/uuid.hpp>
- #include <boost/uuid/uuid_generators.hpp>
- { // 使用memcpy的例子
- unsigned char uuid_data[16];
- // 填充uuid_data
- boost::uuids::uuid u;
- memcpy(&u, uuid_data, 16);
- }
- { // 使用初始化器的例子
- boost::uuids::uuid u =
- { 0x12 ,0x34, 0x56, 0x78
- , 0x90, 0xab
- , 0xcd, 0xef
- , 0x12, 0x34
- , 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef
- };
- }
- // 建立一个uuid类的例子
- // 使用默认机制在构造时初始化一个值
- class uuid_class : public boost::uuids::uuid
- {
- public:
- uuid_class()
- : boost::uuids::uuid(boost::uuids::random_generator()())
- {}
- explicit uuid_class(boost::uuids::uuid const& u)
- : boost::uuids::uuid(u)
- {}
- operator boost::uuids::uuid() {
- return static_cast<boost::uuids::uuid&>(*this);
- }
- operator boost::uuids::uuid() const {
- return static_cast<boost::uuids::uuid const&>(*this);
- }
- };
- uuid_class u1;
- uuid_class u2;
- assert(u1 != u2);
字节提取
有时直接取得uuid的16字节是有用的。典型用法如下:
- boost::uuids::uuid u;
- std::vector<char> v(u.size());
- std::copy(u.begin(), u.end(), v.begin());
注:boost::uuids::uuid::size()总是返回16。