在C++中生成唯一ID的算法?

Aja*_*jay 30 c++ uniqueidentifier

什么是在C++中生成唯一ID的最佳算法?长度ID应为32位无符号整数.

Han*_*ant 56

获得一个独特的32位ID非常简单:下一个.工作40亿次.如果您需要一秒钟,独特的136年.魔鬼在细节上:前一个是什么?您需要一种可靠的方法来持久保存最后使用的值和一种原子方式来更新它.

这将有多难取决于ID的范围.如果它是一个进程中的一个线程,那么您只需要一个文件.如果在一个进程中它是多个线程,那么您需要一个文件和一个互斥锁.如果一台机器上有多个进程,那么您需要一个文件和一个命名的互斥锁.如果它是多台计算机上的多个进程,那么您需要分配一个权威ID提供程序,即所有计算机都与之通信的单个服务器.数据库引擎是这样的通用提供程序,它们具有内置的功能,自动增量列.

随着范围扩大,获取ID的费用逐渐增加.当它变得不切实际,范围是Internet或提供程序太慢或不可用时,您需要放弃32位值.切换到随机值.一个随机足以使机器被流星撞击的可能性比重复相同的ID至少高出一百万倍.一个goo-ID.它只有4倍大.


jal*_*alf 11

这是我能想到的最简单的ID.

MyObject obj;
uint32_t id = reinterpret_cast<uint32_t>(&obj);
Run Code Online (Sandbox Code Playgroud)

在任何给定时间,此ID在整个应用程序中都是唯一的.没有其他对象位于同一地址.当然,如果重新启动应用程序,可能会为该对象分配一个新ID.一旦对象的生命周期结束,可以为另一个对象分配相同的ID.

并且可以为不同存储空间(例如,在不同计算机上)中的对象分配相同的ID.

最后但并非最不重要的是,如果指针大小大于32位,则映射将不是唯一的.

但是既然我们对你想要什么样的ID以及它应该是多么独特一无所知,这似乎是一个很好的答案.

  • 我已经指出了这一点.如果指针大小大于32位,则会发生冲突.但是,由于我们几乎不知道ID需要什么,或者在哪种类型的应用程序中,我只想提出简单明了的解决方案. (8认同)
  • 小心这种方法.我使用了相同的方法,当您删除对象并创建新对象时,新对象可以具有相同的地址.如果您有多线程应用程序,那就太危险了. (4认同)

Saj*_*ani 7

你可以看到这个.(我认为,完整的答案是在Stack Overflow上.)本网站的
Linux中C++中唯一ID的注释.您可以在Linux中使用uuid,请参阅此手册页并为此进行示例.

如果您使用Windows并需要Windows API,请参阅此MSDN页面.

这个维基百科页面也很有用:http://en.wikipedia.org/wiki/Universally_Unique_Identifier.

  • 是的,想用linux.谢谢你的链接. (2认同)