在C ++中生成唯一ID的最佳算法是什么? 长度ID应该是32位无符号整数。
答案 0 :(得分:55)
获得一个独特的32位ID非常简单:下一个。工作40亿次。如果您需要一秒钟,独特的136年。魔鬼在细节上:前一个是什么?您需要一种可靠的方法来持久保存最后使用的值和原子方式来更新它。
这有多难取决于ID的范围。如果它是一个进程中的一个线程,那么您只需要一个文件。如果在一个进程中它是多个线程,那么您需要一个文件和一个互斥锁。如果一台机器上有多个进程,那么您需要一个文件和一个命名的互斥锁。如果在多台计算机上有多个进程,则需要分配权威ID提供程序,即所有计算机都与之通信的单个服务器。数据库引擎是这样的常见提供者,它们内置了一个功能,一个自动增量列。
随着范围扩大,获取ID的费用逐渐增加。当它变得不切实际,范围是Internet或提供程序太慢或不可用时,您需要放弃32位值。切换到随机值。一个随机足以使机器被流星撞击的可能性比重复相同的ID至少高出一百万倍。一个goo-ID。它只是它的4倍。
答案 1 :(得分:11)
这是我能想到的最简单的ID。
MyObject obj;
uint32_t id = reinterpret_cast<uint32_t>(&obj);
在任何给定时间,此ID在整个应用程序中都是唯一的。没有其他对象位于同一地址。当然,如果重新启动应用程序,可能会为该对象分配一个新ID。一旦对象的生命周期结束,可以为另一个对象分配相同的ID。
可以为不同内存空间(例如,在不同计算机上)中的对象分配相同的ID。
最后但并非最不重要的是,如果指针大小大于32位,则映射将不是唯一的。
但是,既然我们对你想要什么样的ID以及它应该是多么独特一无所知,这似乎是一个很好的答案。
答案 2 :(得分:7)
您可以看到this。 (我认为完整的答案是Stack Overflow。)
请注意this site中Linux中C ++中的唯一ID。你可以在Linux中使用uuid,为此请看这个人page and sample。
如果您使用Windows并需要Windows API,请参阅此MSDN page。
此维基百科页面也很有用:http://en.wikipedia.org/wiki/Universally_Unique_Identifier。
答案 3 :(得分:1)
DWORD uid = ::GetTickCount();
::Sleep(100);
答案 4 :(得分:0)
如果你有能力使用Boost,那么有一个UUID库应该可以解决问题。它非常简单易用 - 请查看文档和this answer。
答案 5 :(得分:-1)
上下文很少,但如果您要为应用程序中的对象寻找唯一ID,则可以始终使用类似于
的单例方法class IDGenerator {
public:
static IDGenerator * instance ();
uint32_t next () { return _id++; }
private:
IDGenerator () : _id(0) {}
static IDGenerator * only_copy;
uint32_t _id;
}
IDGenerator *
IDGenerator::instance () {
if (!only_copy) {
only_copy = new IDGenerator();
}
return only_copy;
}
现在您可以通过以下方式随时获取唯一ID:
IDGenerator::instance()->next ()