生成一个唯一的ID C++

Generate a unique ID C++

本文关键字:唯一 ID C++ 一个      更新时间:2024-05-23

我想生成一个唯一的标识符"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。主要的缺点是堆栈的额外存储空间,但堆栈总是可以根据需要增长

如果您正在寻找一种生成超越空间和时间的唯一标识符的方法,您可能需要查看boost的uuid子库
这个库是一个工具和功能的宝库,使使用uuid变得轻而易举。

下面的代码片段展示了如何创建一个新的uuid并将其宇宙之美显示给std::cout

要在Windows11上的MinGW64上编译此代码,您需要调用以下命令(我没有linux机器(:

g++ main.cpp -lBcrypt

#include <iostream>
#include "boost/uuid/uuid.hpp"
#include "boost/uuid/uuid_generators.hpp"
#include "boost/uuid/uuid_io.hpp" // for streaming operators
// A function that returns a new uuid from the boost::uuids::random_generator
boost::uuids::uuid NewUUID() noexcept
{
auto uuid{boost::uuids::random_generator{}()};
return uuid;
}
int main()
{
auto uuid{NewUUID()}; 
std::cout << uuid << std::endl;
return 0;
}

样本输出

...>a.exe
6d4b65e9-3ed3-4b56-9936-2ef345c48569

此输出显示了代码生成的一个可能的uuid。每次运行程序时,你都会得到一个不同的uuid,它在多元宇宙中是独一无二的。

boost.uuid注意事项

我的机器上安装了boost 1.82。如果您正确配置了boost,则不需要静态/动态地链接任何库。