Как использовать boost :: uuids :: uuid для преобразования в 128/64 битные числа?

Я использую этот код для создания UUID из boost:

boost::uuids::random_generator gen;
boost::uuids::uuid uuidId = gen();
string randomUUID = boost::lexical_cast<std::string>(uuidId);
std::remove( randomUUID.begin(), randomUUID.end(), '-');
randomUUID = "0x" + randomUUID;

Это дает мне шестнадцатеричные числа, такие как: «0xCC5B9F6946EF4448A89EDB2042E0B084».

Мой вопрос: как преобразовать эту строку (128-битное шестнадцатеричное число) в длинную 128 или 64-битную длинную (это нормально, чтобы потерять более высокие данные)?

Стандартный атолл C и C ++ std :: stoll в этом случае не помогают.

UUID предпочтительнее для качества случайной генерации.

Спасибо!

0

Решение

Это работает таким образом, но энтропия нуждается в исследовании:

typedef unsigned long long ull;
//...
ull ui64 = 0;
const int startPosition = 18;//can vary - we can use rand() too
const int lengthHex = 14;//can vary - we can use rand() too
boost::uuids::random_generator gen;
boost::uuids::uuid uuidId = gen();
string randomUUID = boost::lexical_cast<std::string>(uuidId);
std::remove( randomUUID.begin(), randomUUID.end(), '-');
randomUUID = "0x" + randomUUID.substr(startPosition, lengthHex);
ui64 = std::stoull(randomUUID, 0, 16); //random out of UUID
std::cout << ui64 << '\n';
0

Другие решения

Если все, что вам нужно, это случайное 64-битное целое число без знака, тогда вы можете просто использовать стандарт C ++ 11:

std::mt19937_64 engine(std::random_device{}());
std::uniform_int_distribution<uint64_t> distribution;
auto ui64 = distribution(engine);

Живая демо.

0