Index: base/guid_posix.cc |
diff --git a/base/guid_posix.cc b/base/guid_posix.cc |
index 1b6d56fdea2d2ce6702826487c3a4595623eef83..9681b084fa300b204f9c80afd01b1c6d3a14f63c 100644 |
--- a/base/guid_posix.cc |
+++ b/base/guid_posix.cc |
@@ -11,6 +11,20 @@ namespace base { |
std::string GenerateGUID() { |
uint64 sixteen_bytes[2] = { base::RandUint64(), base::RandUint64() }; |
+ |
+ // Set the GUID to version 4 as described in RFC 4122, section 4.4. |
+ // The format of GUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, |
+ // where y is one of [8, 9, A, B]. |
+ |
+ // Clear the version bits and set the version to 4: |
+ sixteen_bytes[0] &= 0xffffffffffff0fffULL; |
+ sixteen_bytes[0] |= 0x0000000000004000ULL; |
+ |
+ // Set the two most significant bits (bits 6 and 7) of the |
+ // clock_seq_hi_and_reserved to zero and one, respectively: |
+ sixteen_bytes[1] &= 0x3fffffffffffffffULL; |
+ sixteen_bytes[1] |= 0x8000000000000000ULL; |
+ |
return RandomDataToGUIDString(sixteen_bytes); |
} |