生成一个唯一的ID C++
Generate a unique 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。主要的缺点是堆栈的额外存储空间,但堆栈总是可以根据需要增长
如果您正在寻找一种生成超越空间和时间的唯一标识符的方法,您可能需要查看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,则不需要静态/动态地链接任何库。
- 编译时检查特征专用化是否具有唯一 ID
- 如何实现唯一 id 队列,其中元素可以在 C++ 中"bumped"到顶部?
- 如何在链表中生成唯一 ID?
- constexpr 唯一 ID,使用 clang 编译,但不使用 GCC 编译
- 可以为实体生成 8 字节的唯一 ID
- 运行Yocto的嵌入式系统的唯一ID
- c++需要字符串的唯一ID,但无论顺序如何都必须相同
- 三维空间中的体素唯一ID
- 获取在同一查询中创建的行的唯一 ID
- Windows登录的用户唯一ID
- C++编译时唯一ID生成器总是返回相同的值
- 组合相同的唯一ID项
- 使用整型指针作为唯一id有多糟糕?c++ 11
- 来自c++ /CX的设备唯一id
- c++中线程安全的唯一id生成
- 如何在c++中管理文件唯一id
- 通过模板为项目范围内的唯一id自动增加类型
- IOKit 并获取唯一 ID
- 生成类唯一id的有效方法
- 窗口编程(C++):如何检查子窗口ID是否被占用?以及如何生成子窗口的唯一ID