我想为我的应用生成UUID,以区分每个应用程序的安装。 我想使用C ++生成此UUID,而不需要boost库支持。 如何使用其他开源库生成UUID?
注意:我的平台是Windows。
如果你正在使用现代化的C++,那么这将非常合适。
#include <random>
#include <sstream>
namespace uuid {
static std::random_device rd;
static std::mt19937 gen(rd());
static std::uniform_int_distribution<> dis(0, 15);
static std::uniform_int_distribution<> dis2(8, 11);
std::string generate_uuid_v4() {
std::stringstream ss;
int i;
ss << std::hex;
for (i = 0; i < 8; i++) {
ss << dis(gen);
}
ss << "-";
for (i = 0; i < 4; i++) {
ss << dis(gen);
}
ss << "-4";
for (i = 0; i < 3; i++) {
ss << dis(gen);
}
ss << "-";
ss << dis2(gen);
for (i = 0; i < 3; i++) {
ss << dis(gen);
}
ss << "-";
for (i = 0; i < 12; i++) {
ss << dis(gen);
};
return ss.str();
}
}
rd()
)生成的32位值进行种子,因此该函数只能生成2^32个可能的uuid。不要使用此答案或类似答案,否则可能会引入安全问题。请参见此问题,已经被Downvote。 - Alba Mendez如评论中所述,您可以使用UuidCreate函数。
#pragma comment(lib, "rpcrt4.lib") // UuidCreate - Minimum supported OS Win 2000
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
UUID uuid;
UuidCreate(&uuid);
char *str;
UuidToStringA(&uuid, (RPC_CSTR*)&str);
cout<<str<<endl;
RpcStringFreeA((RPC_CSTR*)&str);
return 0;
}
#include <rpc.h>
(而不是 #include <windows.h>
) - user4851如果你只想要一些随机内容,我写了这个小函数:
string get_uuid() {
static random_device dev;
static mt19937 rng(dev());
uniform_int_distribution<int> dist(0, 15);
const char *v = "0123456789abcdef";
const bool dash[] = { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0 };
string res;
for (int i = 0; i < 16; i++) {
if (dash[i]) res += "-";
res += v[dist(rng)];
res += v[dist(rng)];
}
return res;
}
ossp-uuid库可以生成UUID并且有C++绑定。
看起来使用非常简单:
#include <uuid++.hh>
#include <iostream>
using namespace std;
int main() {
uuid id;
id.make(UUID_MAKE_V1);
const char* myId = id.string();
cout << myId << endl;
delete myId;
}
2021年,我建议使用单头文件库stduuid。它跨平台且不会引入任何不必要的依赖。
从项目的github页面下载uuid.h
,然后可以使用以下示例:
#include <iostream>
#include <string>
#define UUID_SYSTEM_GENERATOR
#include "uuid.h"
int main (void) {
std::string id = uuids::to_string (uuids::uuid_system_generator{}());
std::cout << id << std::endl;
}
请查看该项目的 Github 页面,了解更多有关各种选项和生成器的详细信息和文档。
传统上,UUID只是机器的MAC地址与自西方采用公历以来的100纳秒间隔数拼接而成。因此,编写一个C++class
执行此操作并不太困难。
rand()
或其他(伪)随机函数呢?请问原因是什么? - DevSolar<random>
,比rand()
好得多。 - Basile Starynkevitch#include "uuid/uuid.h"
...
unique_identifier_msgs::msg::UUID uuid;
uuid_generate(uuid.uuid.data());
man 3 uuid_generate
或在线 https://github.com/util-linux/util-linux/blob/master/libuuid/man/uuid_generate.3.adoc
许可证
宽松,参见 https://github.com/util-linux/util-linux/blob/master/libuuid/src/uuid.h 的头文件
为什么要这个新答案
扩展 @harmic 的答案,因为它提到了两个解决方案,后者很容易被忽略。
这段代码对我来说可行 :)
#pragma comment(lib, "rpcrt4.lib")
#include <windows.h>
#include <rpcdce.h>
/*
* Generate a Universal Unique Identifier using windows api.
* Note: throw exceptions if uuid wasn't created successfully.
*/
std::string generate_uuid()
{
UUID uuid;
RPC_CSTR uuid_str;
std::string uuid_out;
if (UuidCreate(&uuid) != RPC_S_OK)
std::cout << "couldn't create uuid\nError code" << GetLastError() << std::endl;
if (UuidToStringA(&uuid, &uuid_str) != RPC_S_OK)
std::cout << "couldn't convert uuid to string\nError code" << GetLastError() << std::endl;
uuid_out = (char*)uuid_str;
RpcStringFreeA(&uuid_str);
return uuid_out;
}
#include "rst/guid/guid.h"
std::string guid = rst::Guid().AsString();
// Performs no allocations.
std::cout << rst::Guid().AsStringView().value() << std::endl;
rpc.h
中的UuidCreate
。例如:http://nogeekhere.blogspot.in/2008/07/how-to-generate-uuid-guid-in-c.html - Favonius