Как я могу сгенерировать UUID в С++ без использования библиотеки boost?
Я хочу сгенерировать UUID для моего приложения, чтобы различать каждую установку моего приложения. Я хочу сгенерировать этот UUID с помощью С++ без поддержки библиотеки boost. Как я могу сгенерировать UUID с помощью другой библиотеки open source?
Примечание. Моя платформа - это окна
Ответы
Ответ 1
Как упоминалось в комментариях, вы можете использовать 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;
}
Ответ 2
Библиотека ossp-uuid может генерировать UUID и имеет привязки С++.
Кажется чрезвычайно простым в использовании:
#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;
}
Обратите внимание, что он выделяет и возвращает строку C-стиля, которую вызывающий код должен освободить, чтобы избежать утечки.
Другая возможность - libuuid, которая является частью пакета util-linux, доступного из ftp://ftp.kernel.org/pub/linux/utils/util-linux/. Любой Linux-компьютер уже установит его. У него нет С++ API, но он по-прежнему может быть вызван из С++ с использованием API C.
Ответ 3
Традиционно UUID - это просто MAC-адрес машины, объединенный с числом 100-наносекундных интервалов с момента принятия григорианского календаря на Западе. Так что не сложно написать С++ class
, который сделает это для вас.
Ответ 4
Если вы просто хотите что-то случайное, я написал эту маленькую функцию:
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;
}