備忘録

備忘録

C++でUUID(v4)を生成する方法

Ⅰ. はじめに

タイトルの通り「C++でUUID(v4)を生成する方法」です。

Ⅱ. やり方(Botanを利用する場合)

1. Botanをインストールする
vcpkg install botan
2. サンプルプログラムを書く
#include <iostream>
#include <botan/uuid.h>
#include <botan/auto_rng.h>

using namespace Botan;

int main()
{
  std::unique_ptr<Botan::RandomNumberGenerator> rng(new Botan::AutoSeeded_RNG);
  auto str = (new Botan::UUID(*rng.get()))->to_string();

  std::cout << str << std::endl;

  // 小文字
  std::transform(str.begin(), str.end(), str.begin(), tolower);
  std::cout << str << std::endl;

  return 0;
}
3. 実行結果
B71A15A6-AA7F-49DA-A6A0-CB05B6C5D17A
b71a15a6-aa7f-49da-a6a0-cb05b6c5d17a

Ⅲ. やり方(Windowsのみ)

1. サンプルプログラムを書く
#include <Windows.h>
#include <string>
#include <iostream>

std::string GuidToString(GUID guid)
{
  // https://gist.github.com/vincenthsu/8fab51834e3a04074a57
  char guid_cstr[37];
  snprintf(guid_cstr, sizeof(guid_cstr),
    "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
    guid.Data1, guid.Data2, guid.Data3,
    guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
    guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);

  return std::string(guid_cstr);
}

int main()
{
  GUID guid;
  auto result = CoCreateGuid(&guid);
  if (result == S_OK)
  {
    std::cout << GuidToString(guid) << std::endl;
  }

  return 0;
}
2. 実行結果
aa55ef25-d7ea-41cc-91b5-68f3e4e24a1e