最佳实践:如何获取对象的唯一标识符

时间:2013-01-29 14:36:44

标签: c++

我有几个对象,需要为它们生成一个唯一的标识符,在每个对象的生命周期内不会被更改/重复。

基本上我想为我的对象获取/生成一个唯一的id,就像这样

int id = reinterpret_cast<int>(&obj);

int id = (int)&obj;

我理解上面的代码是坏主意,因为int可能不足以存储地址等。

那么从对象中获取唯一标识符的最佳做法是什么?这将是一个可移植的解决方案?

6 个答案:

答案 0 :(得分:14)

根据您的“唯一性”要求,有以下几种选择:

  • 如果在一个地址空间内是唯一的(“在一个程序执行中”),则并且您的对象保持在内存中,那么指针就可以了。但是存在一些缺陷:如果您的对象存在于容器中,则每次重新分配都可能会更改对象的标识,如果允许复制对象,则可能已在同一地址创建了从某个函数返回的对象。
  • 如果您需要更全局的唯一性,例如因为您正在处理持久性的通信程序或数据,请使用GUID / UUIds,例如boost.uuid
  • 你可以从一些静态计数器创建唯一的整数,但要注意陷阱:
    • 确保您的增量是原子
    • 防止复制或创建自定义副本构造函数,赋值语句。

就个人而言,只要我能负担得起,我的选择就是UUIDs,因为它们让我心情舒畅,而不必考虑所有的陷阱。

答案 1 :(得分:8)

如果需要唯一标识对象,则可以在构造函数中生成唯一ID:

struct Obj
{ 
   int _id;
   Obj() { static int id = 0; _id = id++; }
};

您必须决定如何处理副本/分配(相同的ID - 以上将工作/不同的ID - 您需要一个复制构造函数,可能需要一个static类成员而不是{ {1}}局部变量)。

答案 2 :(得分:4)

当我研究这个问题时,我很快就找到了 Boost UUID 库(通用唯一标识符http://www.boost.org/doc/libs/1_52_0/libs/uuid/)。但是,随着我的项目的发展,我转而使用 Qt的GUID 库(全球唯一标识符http://doc.qt.digia.com/qt/quuid.html)。

为我学到的一个教训是开始声明你自己的UUID类并隐藏实现,以便你可以切换到你以后找到的任何合适的东西。

我希望有所帮助。

答案 3 :(得分:1)

如果你的对象是一个类,那么你可以有一个静态成员变量,你可以将它变为0.然后在构造函数中将这个值存储到类实例中并增加静态变量:

上课

Indexed
{
public:
   Indexed() :
       m_myIndex( m_nextIndex++ )
   { }

   int getIndex() const
   { return m_myIndex; }

private:
   const int m_myIndex;
   static int m_nextIndex;
};

答案 4 :(得分:0)

直接使用对象地址作为唯一(对于此运行)标识符并不是一个坏主意。为什么要把它转换成整数?只需将指针与==比较:

MyObject *obj1, *obj2;
...
if (obj1 == obj2) ...

当然,如果您需要将ID写入数据库等,这将不起作用。在运行之间可以使用相同的指针值。另外,不要重载比较运算符(==)。

答案 5 :(得分:0)

如果您需要分布式环境的唯一ID,请使用boost::uuid