2016-04-28 13 views
0

私はブーストからUUIDを生成するためにこのコードを使用:「0xCC5B9F6946EF4448A89EDB2042E0B084」:boost :: uuids :: uuidを使って128/64ビット数に変換するには?

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; 

は、それは次のように私に16進数を示します。

私の質問は次のとおりです:この文字列(128ビット16進数)を128ビット長または64ビット長に変換するにはどうすればいいですか?

標準C atollとC++ std :: stollは、この場合はサポートしません。

UUIDは、ランダム生成の品質を優先します。

ありがとうございました!

+1

乱数を生成するためにUUIDを使用することはひどい考えです。彼らはメルセントゥイスターのようなものを使って、同様に生成された乱数のエントロピーを得ていません。あなた自身の好意を持ち、C++標準ライブラリに組み込まれた機能を実際に使用して、乱数を生成します(http://stackoverflow.com/a/14009667/2331956)。また、UUIDの部分文字列を取ることは[普通の悪い考えです](https://blogs.msdn.microsoft.com/oldnewthing/20080627-00/?p=21823/) –

+0

私はMersener Twisterを持っていて、私の場合はこのように見えます: –

+0

私はMersener Twisterを持っていて、私の場合は次のようになります:auto const seed = std :: random_device()(); std :: mt19937 mt(seed); std :: uniform_int_distribution dist(12345678,99999999); long l1; long l2; (int i = 0; i <10; ++ i) { l1 = dist(mt); l2 = dist(mt); std :: cout << l1 << l2 << "\ n"; } 私は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); 

Live demo

関連する問題