微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

生成唯一 ID C++

如何解决生成唯一 ID C++

我想为我的复杂结构生成一个唯一标识符“ident”,我该怎么做?

在我的标题中,复合结构是:

struct Complexe {
    float x;
    float y;
    static unsigned int ident;
};

void Init(Complexe&);

etc...

在cpp文件中,我需要给ident一个唯一的int属性

Init(Complexe&z){
    z.ident = 0;
    z.y = 0;
    z.x = 0;
};

解决方法

我可以向您推荐std::hash吗?

std::size_t ident = std::hash<Complex>()(complexVar);

从内存中写入它,但它应该为每个 Complex 类型的对象返回唯一值(不是的可能性很小)。

,

考虑 UUID,特别是 GNU/Linux 上的 uuid_generate,或(似乎)Windows 上的 UuidCreate。

,

即使您想编写自己的算法,生成唯一 ID 也很容易。尽管如果您工作的环境是多线程的,您的算法将需要一些思考。在这种情况下,您需要编写线程安全代码。例如下面的代码将生成一个唯一的 id 并且也是线程安全的:

class Utility {
public :
    static int getUniqueId();
};

int Utility::getUniqueId() {
    static std::atomic<std::uint32_t> uid { 0 };
    return ++uid;
}
,

一种简单的方法是制作一个空闲列表来帮助您重用 ID。因此,例如,您从 ID 0 开始,每当您创建结构时,您首先要检查空闲列表中是否有任何已发布的 ID。第一次通过时它将为空,因此您将 ID 计数器增加到 1 并将其用于您的新结构。当您销毁一个结构时,它的 ID 会返回到空闲列表(可以实现为堆栈),以便下次您创建一个结构时,该 ID 将被重用。如果空闲列表中的 ID 用完,您只需从上次停止的地方开始增加 ID 计数器......清洗、冲洗并重复。这种方法的好处是,如果您的程序最终运行了很长时间,您将永远不会包装整数范围并意外使用已经在使用的 ID。主要的缺点是堆栈的额外存储空间,但堆栈始终可以根据需要增长。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。