3

我使用此代码从 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 优先用于随机生成质量。

谢谢!

4

2 回答 2

1

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

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

现场演示

于 2016-04-29T12:41:18.250 回答
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';
于 2016-04-29T07:51:08.813 回答