Opened 13 years ago
Closed 13 years ago
#3971 closed Patches (fixed)
basic_random_generator doesn't produce a fully randomized uuid when sizeof(unsigned long) == 4
Reported by: | Owned by: | Andy Tompkins | |
---|---|---|---|
Milestone: | Boost 1.43.0 | Component: | uuid |
Version: | Boost 1.42.0 | Severity: | Showstopper |
Keywords: | Cc: |
Description
There is a flaw in basic_random_generator<> (boost/uuid/uuid_generators.hpp, line 366-374) that means it will only generate about 4 billion different values before a collision on the many platforms where sizeof(unsigned long) == 4.
On these platforms the first 8 bytes of the uuid are populated with random data, but the contents of the remaining 8 bytes are undefined.
In my tests they are populated with repeated data, due to Microsoft's specific implementation for the undefined behaviour of >> when its "right operand is greater than or equal to the length in bits of the promoted left operand."
For example, try the following test program with a Win32 build by Visual C++ 9.0 –
#include <iostreams> #include <boost/uuid/uuid_generators.hpp> #include <boost/uuid/uuid_io.hpp> int main( int, char*[] ) { std::cout << boost::uuids::random_generator()() << std::endl; return 0; }
This produced for me:
f1633d75-ee94-47b9-ae94-37b9ee9437b9
Or wrapped to show the problem:
f1633d75- ee94-47b9- ae94-37b9 ee94 37b9
The simplest patch could be just:
370a370 > i=0;
Change History (2)
comment:1 by , 13 years ago
Severity: | Problem → Showstopper |
---|
comment:2 by , 13 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
Fixed as suggested in both trunk and merged into release.