【问题标题】:How to use boost::uuids::uuid to convert to 128/64 bit numbers?如何使用 boost::uuids::uuid 转换为 128/64 位数字?
【发布时间】:2016-08-23 06:24:33
【问题描述】:

我使用这段代码从 boost 中生成 UUID:

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 优先用于随机生成质量。

谢谢!

【问题讨论】:

  • 使用 UUID 生成随机数是一个糟糕的主意。他们没有使用类似 mersenne twister 的类似的、正确生成的随机数的熵。帮自己一个忙,实际使用 C++ 标准库中内置的功能来生成随机数like this。同样采用 UUID 的子字符串是 plain bad idea
  • 我有 Mersener Twister,就我而言,它看起来像这样:
  • 我有 Mersener Twister,就我而言,它看起来像这样: auto const seed = std::random_device()();标准::mt19937 mt(种子); std::uniform_int_distribution dist(12345678, 99999999);长l1;长l2; for (int i=0; i
  • boost::uuids::random_generator 使用 Mersenne Twister。因此,没有理由期望它提供比直接使用 Mersenne Twister 更好质量的随机生成。而且,正如 Mike 所说,使用 UUID 的子字符串生成随机数似乎很奇怪。

标签: c++ boost std uuid 128-bit


【解决方案1】:

如果你想要的只是一个随机的 64 位无符号整数,那么你可以使用标准 C++11:

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

Live demo.

【讨论】:

  • 还有例外?!
【解决方案2】:

它是这样工作的,但熵需要研究:

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';

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2013-05-04
    • 2018-12-20
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2014-03-28
    • 2012-07-26
    相关资源
    最近更新 更多