<div dir="ltr">No, I just find that UUID v4 is not a 128-bit random number but a 122-bit random number. I don't think the previous code caused a symptom or anything, but that's technically incorrect.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 29, 2017 at 3:01 PM, Zachary Turner <span dir="ltr"><<a href="mailto:zturner@google.com" target="_blank">zturner@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">How did you find this?  Was it causing a symptom of something breaking?</div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 29, 2017 at 2:54 PM Rui Ueyama via Phabricator <<a href="mailto:reviews@reviews.llvm.org" target="_blank">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">ruiu created this revision.<br>
Herald added subscribers: hiraditya, emaste.<br>
<br>
Correctly set reserved bits for UUID version 4.<br>
<br>
<br>
<a href="https://reviews.llvm.org/D40623" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D40623</a><br>
<br>
Files:<br>
  lld/ELF/SyntheticSections.cpp<br>
  llvm/include/llvm/Support/<wbr>RandomNumberGenerator.h<br>
  llvm/lib/Support/<wbr>RandomNumberGenerator.cpp<br>
<br>
<br>
Index: llvm/lib/Support/<wbr>RandomNumberGenerator.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/lib/Support/<wbr>RandomNumberGenerator.cpp<br>
+++ llvm/lib/Support/<wbr>RandomNumberGenerator.cpp<br>
@@ -89,3 +89,15 @@<br>
   return std::error_code(errno, std::system_category());<br>
 #endif<br>
 }<br>
+<br>
+// UUID v4 is a 122-bit random number in the form of<br>
+// RRRRRRRR-RRRR-4RRR-xRRR-<wbr>RRRRRRRRRRRR, where R is a random byte and<br>
+// x's most siginificant two bits are 0b10.<br>
+std::error_code llvm::getUuidV4(void *Buffer) {<br>
+  if (auto EC = getRandomBytes(Buffer, 16))<br>
+    return EC;<br>
+  char *Buf = (char *)Buffer;<br>
+  Buf[7] = 0x40 | (Buf[7] & 0xf);<br>
+  Buf[9] = 0x80 | (Buf[9] & 0x3f);<br>
+  return std::error_code();<br>
+}<br>
Index: llvm/include/llvm/Support/<wbr>RandomNumberGenerator.h<br>
==============================<wbr>==============================<wbr>=======<br>
--- llvm/include/llvm/Support/<wbr>RandomNumberGenerator.h<br>
+++ llvm/include/llvm/Support/<wbr>RandomNumberGenerator.h<br>
@@ -65,6 +65,9 @@<br>
<br>
 // Get random vector of specified size<br>
 std::error_code getRandomBytes(void *Buffer, size_t Size);<br>
+<br>
+// Get UUID v4.<br>
+std::error_code getUuidV4(void *Buffer);<br>
 }<br>
<br>
 #endif<br>
Index: lld/ELF/SyntheticSections.cpp<br>
==============================<wbr>==============================<wbr>=======<br>
--- lld/ELF/SyntheticSections.cpp<br>
+++ lld/ELF/SyntheticSections.cpp<br>
@@ -368,7 +368,7 @@<br>
     });<br>
     break;<br>
   case BuildIdKind::Uuid:<br>
-    if (auto EC = getRandomBytes(HashBuf, HashSize))<br>
+    if (auto EC = getUuidV4(HashBuf))<br>
       error("entropy source failure: " + EC.message());<br>
     break;<br>
   case BuildIdKind::Hexstring:<br>
<br>
<br>
</blockquote></div>
</div></div></blockquote></div><br></div>