【发布时间】:2011-08-05 08:45:57
【问题描述】:
是否有一种惯用的 C++ 方法来保留和回收保证唯一的标识符?我的要求是:
- 假设存在当前未保留的 ID,reserve_id(void) 将返回该 ID。
- 在reserve_id() 调用的连续序列中,不会返回单个标识符两次
- 有一个函数 recycle(id_type) 将标识符返回给可用池。
例如,我见过 Boost::Uuid,但是 a) 我没有看到断言两个 UUID 保证唯一性的文档,并且 b) 我暂时受限于 Boost (1.40) 的早期版本.如果这特别适合这项任务,我可以推动升级。
【问题讨论】:
-
您的要求不明确:按照说明,您可以使用静态 id 计数器
sprintf("id%d", ++id),这对数十亿个值很有用,或者在+= 'x'之后返回std::string;-)。如果在实践中这些值没有用完,回收可能是一个空操作,或者您可以创建一个 deque 并优先使用它。在长度、格式、性能、跨主机唯一性、跨进程运行唯一性等方面,您真正有哪些其他限制/期望?或者我们应该推断出类似于 Boost::Uuid 目的的需求? -
明确地说,我担心整数环绕,因为我正在编写一个长时间运行的服务器。我主要关心的是上面的#2。
-
您可以轻松地使用无符号 64 位
int,甚至可以使用简单的if (!++low_order) ++high_order;链接 2...?在太阳熄灭之前应该没问题.... -
值得考虑“极不可能”复制意味着什么。维基百科描述了 122 位随机 UUID 的机会“换句话说,只有在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。一个副本的概率约为 50如果地球上每个人都拥有 6 亿个 UUID。” en.wikipedia.org/wiki/Universally_unique_identifier。 IMO 更有可能出现某种类型的硬件故障,从而在您使用的任何精心设计的代码中为您提供副本。
-
@Michael Anderson:我真的希望你不是负责设计飞机、汽车或核能的东西 :-)