2016-04-28 6 views
0

Ich benutze diesen Code UUIDs von Auftrieb zu erzeugen:Wie boost :: UUIDs :: UUID zu 128/64 Bit-Zahlen zu konvertieren?

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; 

Es gibt mir Hex-Zahlen wie: "0xCC5B9F6946EF4448A89EDB2042E0B084".

Meine Frage ist: Wie konvertiert man diese Zeichenfolge (128 Bit Hex-Zahl) in 128 lange lange ODER 64 Bit lange (es ist Ok, um höhere Daten zu verlieren)?

Standard C Atoll und C++ Std :: Stoll helfen in diesem Fall nicht.

UUID bevorzugt für zufällige Erzeugungsqualität.

Vielen Dank!

+1

Die Verwendung von UUIDs zum Generieren von Zufallszahlen ist eine schreckliche Idee. Sie haben nicht die Entropie einer ähnlichen, richtig generierten Zufallszahl, die etwas wie einen Mersenne Twister verwendet. Tun Sie sich selbst einen Gefallen und verwenden Sie tatsächlich die Funktionalität, die in die C++ - Standardbibliothek eingebaut ist, um Zufallszahlen [wie diese] zu erzeugen (http://stackoverflow.com/a/14009667/2331956). Subtrings von UUIDs zu nehmen ist auch eine [einfache schlechte Idee] (https://blogs.msdn.microsoft.com/oldnewthing/20080627-00/?p=21823/) –

+0

Ich habe Mersener Twister und in meinem Fall sieht es so aus : –

+0

Ich habe Mersener Twister und in meinem Fall sieht es so aus: auto const same = std :: random_device()(); Std :: mt19937 mt (Samen); Std :: uniform_int_distribution dist (12345678, 99999999); lang l1; lang l2; für (int i = 0; i <10; ++ i) { l1 = dist (mt); l2 = dist (mt); std :: cout << l1 << l2 << "\ n"; } Ich denke, dass UUID bieten mehr Qualität Zufallszahlen. –

Antwort

0

Es funktioniert auf diese Weise aber die Entropie braucht Forschung:

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

Wenn alles, was Sie eine zufällige 64-Bit-Integer ohne Vorzeichen ist, dann können Sie nur Standard verwenden C++ 11:

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

Live demo .

Verwandte Themen