web-dev-qa-db-fra.com

Comment puis-je générer un UUID en c ++, sans utiliser la bibliothèque boost?

Je souhaite générer un UUID pour mon application afin de distinguer chaque installation de mon application. Je veux générer cet UUID à l'aide de C++ sans prise en charge de la bibliothèque boost. Comment puis-je générer un UUID à l'aide d'une autre bibliothèque opensource?

Remarque: ma plate-forme est Windows

15
PURE

Comme mentionné dans les commentaires, vous pouvez utiliser idCreate

#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;
}
13
Yuval

Si vous voulez juste quelque chose de aléatoire, j'ai écrit cette petite fonction:

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;
}
3
CaptainCodeman

La bibliothèque ossp-uuid peut générer des UUID et possède des liaisons C++.

Il semble extrêmement simple à utiliser:

#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;
}

Notez qu'il alloue et renvoie une chaîne de style C, que le code appelant doit désallouer pour éviter une fuite.

Une autre possibilité est libuuid, qui fait partie du paquet util-linux, disponible sur ftp://ftp.kernel.org/pub/linux/utils/util-linux/ . Toute machine Linux l'aura déjà installé. Il ne possède pas d'API C++ mais peut toujours être appelé à partir de C++ à l'aide de l'API C.

3
harmic

Cela fera l'affaire, si vous utilisez le C++ moderne.

#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();
    }
}
2
Sashank Aryal

Traditionnellement, les UUID sont simplement l'adresse MAC de la machine concaténée avec le nombre d'intervalles de 100 nanosecondes depuis l'adoption du calendrier grégorien en Occident. Il n'est donc pas trop difficile d'écrire un C++ class qui le fait pour vous.

1
Paul Evans