<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.0.2) -->
<?rfc strict="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-uuidrev-rfc4122bis-00" category="std" consensus="true" submissionType="IETF" obsoletes="4122" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.15.1 -->
  <front>
    <title abbrev="A UUID URN Namespace">A Universally Unique IDentifier (UUID) URN Namespace</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-uuidrev-rfc4122bis-00"/>
    <author initials="P." surname="Leach" fullname="P. Leach">
      <organization>Microsoft</organization>
      <address>
        <email>paulle@microsoft.com</email>
      </address>
    </author>
    <author initials="M." surname="Mealling" fullname="M. Mealling">
      <organization>VeriSign, Inc.</organization>
      <address>
        <email>michael@refactored-networks.com</email>
      </address>
    </author>
    <author initials="B. G." surname="Peabody" fullname="Brad G. Peabody">
      <organization/>
      <address>
        <email>brad@peabody.io</email>
      </address>
    </author>
    <author initials="K. R." surname="Davis" fullname="Kyzer R. Davis">
      <organization>Cisco Systems</organization>
      <address>
        <email>kydavis@cisco.com</email>
      </address>
    </author>
    <date year="2022"/>
    <area>ART</area>
    <workgroup>uuidrev</workgroup>
    <keyword>uuid</keyword>
    <abstract>
      <t>This specification defines a Uniform Resource Name namespace for
UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
Unique IDentifier).  A UUID is 128 bits long, and can guarantee
uniqueness across space and time.  UUIDs were originally used in the
Apollo Network Computing System and later in the Open Software
Foundation's (OSF) Distributed Computing Environment (DCE), and then
in Microsoft Windows platforms.</t>
      <t>This specification is derived from the DCE specification with the
kind permission of the OSF (now known as The Open Group).
Information from earlier versions of the DCE specification have been
incorporated into this document.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="Background">
      <name>Introduction</name>
      <t>This specification defines a Uniform Resource Name namespace for
UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally
Unique IDentifier).  A UUID is 128 bits long, and requires no central
registration process.</t>
      <t>The information here is meant to be a concise guide for those wishing
to implement services using UUIDs as URNs <xref target="RFC8141"/>.  Nothing in this document
should be construed to override the DCE standards that defined UUIDs.</t>
      <t>There is an ITU-T Recommendation and ISO/IEC Standard <xref target="X667"/> that are
derived from earlier versions of this document.  Both sets of
specifications have been aligned, and are fully technically
compatible.  In addition, a global registration function is being
provided by the Telecommunications Standardization Bureau of ITU-T;
for details see <eref target="https://www.itu.int/en/ITU-T/asn1/Pages/UUID/uuids.aspx"/>.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>One of the main reasons for using UUIDs is that no centralized
authority is required to administer them (although one format uses
IEEE 802 node identifiers, others do not).  As a result, generation
on demand can be completely automated, and used for a variety of
purposes.  The UUID generation algorithm described here supports very
high allocation rates of up to 10 million per second per machine if
necessary, so that they could even be used as transaction IDs.</t>
      <t>UUIDs are of a fixed size (128 bits) which is reasonably small
compared to other alternatives.  This lends itself well to sorting,
ordering, and hashing of all sorts, storing in databases, simple
allocation, and ease of programming in general.</t>
      <t>Since UUIDs are unique and persistent, they make excellent Uniform
Resource Names.  The unique ability to generate a new UUID without a
registration process allows for UUIDs to be one of the URNs with the
lowest minting cost.</t>
      <t>Furthermore, many things have changed in the time since UUIDs were originally created.
Modern applications have a need to create and utilize UUIDs as the primary
identifier for a variety of different items in complex computational systems,
including but not limited to database keys, file names, machine or system
names, and identifiers for event-driven transactions.</t>
      <t>One area UUIDs have gained popularity is as database keys.
This stems from the increasingly distributed nature of modern applications.
In such cases, "auto increment" schemes often used by databases do not work
well, as the effort required to coordinate unique numeric identifiers across
a network can easily become a burden.
The fact that UUIDs can be used to create unique, reasonably short values
in distributed systems without requiring synchronization makes them a good
alternative, but UUID versions 1-5 lack certain other desirable characteristics:</t>
      <ol spacing="normal" type="1"><li>Non-time-ordered UUID versions such as UUIDv4 have poor database index
  locality.
  Meaning new values created in succession are not close to each other in
  the index and thus require inserts to be performed at random
  locations.
  The negative performance effects of which on common structures used for
  this (B-tree and its variants) can be dramatic.</li>
        <li>The 100-nanosecond, Gregorian epoch used in UUIDv1 timestamps is uncommon
  and difficult to represent accurately using a standard number format such
  as <xref target="IEEE754"/>.</li>
        <li>Introspection/parsing is required to order by time sequence; as opposed to
  being able to perform a simple byte-by-byte comparison.</li>
        <li>Privacy and network security issues arise from using a MAC address in the
  node field of Version 1 UUIDs.
  Exposed MAC addresses can be used as an attack surface to locate machines
  and reveal various other
  information about such machines (minimally manufacturer, potentially other
  details). Additionally, with the advent of virtual machines and containers,
  MAC address uniqueness is no longer guaranteed.</li>
        <li>Many of the implementation details specified in RFC4122 involved trade
  offs that are neither possible to specify for all applications nor
  necessary to produce interoperable implementations.</li>
        <li>RFC4122 did not distinguish between the requirements for generation
  of a UUID versus an application which simply stores one, which are often
  different.</li>
      </ol>
      <t>Due to the aforementioned issue, many widely distributed database applications
and large application vendors have sought to solve the problem of creating
a better
time-based, sortable unique identifier for use as a database key. This has
lead to numerous implementations
over the past 10+ years solving the same problem in slightly different ways.</t>
      <t>While preparing this specification the following 16 different implementations
were analyzed for trends in total ID length, bit Layout, lexical formatting/encoding,
timestamp type, timestamp format, timestamp accuracy, node format/components,
collision handling and multi-timestamp tick generation sequencing.</t>
      <ol spacing="compact" type="1"><li>
          <xref target="ULID"/> by A. Feerasta</li>
        <li>
          <xref target="LexicalUUID"/> by Twitter</li>
        <li>
          <xref target="Snowflake"/> by Twitter</li>
        <li>
          <xref target="Flake"/> by Boundary</li>
        <li>
          <xref target="ShardingID"/> by Instagram</li>
        <li>
          <xref target="KSUID"/> by Segment</li>
        <li>
          <xref target="Elasticflake"/> by P. Pearcy</li>
        <li>
          <xref target="FlakeID"/> by T. Pawlak</li>
        <li>
          <xref target="Sonyflake"/> by Sony</li>
        <li>
          <xref target="orderedUuid"/> by IT. Cabrera</li>
        <li>
          <xref target="COMBGUID"/> by R. Tallent</li>
        <li>
          <xref target="SID"/> by A. Chilton</li>
        <li>
          <xref target="pushID"/> by Google</li>
        <li>
          <xref target="XID"/> by O. Poitrey</li>
        <li>
          <xref target="ObjectID"/> by MongoDB</li>
        <li>
          <xref target="CUID"/> by E. Elliott</li>
      </ol>
      <t>An inspection of these implementations and the issues described above has
led to this document which attempts to adapt UUIDs to address these issues.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <section anchor="requirements_language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
      <section anchor="acronyms">
        <name>Abbreviations</name>
        <t>The following abbreviations are used in this document:</t>
        <dl indent="14">
          <dt>UUID</dt>
          <dd>
            <t>Universally Unique Identifier</t>
          </dd>
          <dt>URN</dt>
          <dd>
            <t>Uniform Resource Names</t>
          </dd>
          <dt>ABNF</dt>
          <dd>
            <t>Augmented Backus-Naur Form</t>
          </dd>
          <dt>CSPRNG</dt>
          <dd>
            <t>Cryptographically Secure Pseudo-Random Number Generator</t>
          </dd>
          <dt>MAC</dt>
          <dd>
            <t>Media Access Control</t>
          </dd>
          <dt>MSB</dt>
          <dd>
            <t>Most Significant Bit</t>
          </dd>
          <dt>DBMS</dt>
          <dd>
            <t>Database Management System</t>
          </dd>
          <dt>IEEE</dt>
          <dd>
            <t>Institute of Electrical and Electronics Engineers, Inc.</t>
          </dd>
          <dt>ITU</dt>
          <dd>
            <t>International Telecommunication Union</t>
          </dd>
          <dt>MD5</dt>
          <dd>
            <t>Message Digest 5</t>
          </dd>
          <dt>SHA1</dt>
          <dd>
            <t>Secure Hash Algorithm 1</t>
          </dd>
          <dt>UTC</dt>
          <dd>
            <t>Coordinated Universal Time</t>
          </dd>
        </dl>
      </section>
      <section anchor="changelog" removeInRFC="true">
        <name>changelog</name>
        <t>draft-00</t>
        <ul spacing="compact">
          <li>Merge RFC4122 with draft-peabody-dispatch-new-uuid-format-04.md</li>
          <li>Change: Reference RFC1321 to RFC6151</li>
          <li>Change: Reference RFC2141 to RFC8141</li>
          <li>Change: Reference RFC2234 to RFC4234</li>
          <li>Change: Reference FIPS 180-1 to FIPS 180-4 for SHA1</li>
          <li>Change: Converted UUIDv1 to match UUIDv6 section from Draft 04</li>
          <li>Change: Trimmed down the ABNF representation</li>
          <li>Change: http websites to https equivalent</li>
          <li>Errata: Bad Reference to RFC1750 | 3641 #4</li>
          <li>Errata: Change MD5 website to example.com | 3476 #6 (Also Fixes Errata: Fix uuid_create_md5_from_name() | 1352 #2)</li>
          <li>Errata: Typo in code comment | 6665 #11</li>
          <li>Errata: Fix BAD OID acronym | 6225 #9</li>
          <li>Errata: Incorrect Parenthesis usage Section 4.3 | 184 #5</li>
          <li>Errata: Lexicographically Sorting Paragraph Fix | 1428 #3</li>
          <li>Errata: Fix 4.1.3 reference to the correct bits | 1957 #13</li>
          <li>Errata: Fix reference to variant in octet 8 | 4975 #7</li>
          <li>Errata: Further clarify 3rd/last bit of Variant for spec | 5560 #8</li>
          <li>Errata: Fix clock_seq_hi_and_reserved most-significant bit verbiage | 4976 #10</li>
          <li>Errata: Better Clarify network byte order when referencing most significant bits | 3546 #12</li>
          <li>Draft 05: B.2. Example of a UUIDv7 Value two "var" in table #120</li>
          <li>Draft 05: <bcp14>MUST</bcp14> veribage in Reliability of 6.1 #121</li>
          <li>Draft 05: Further discourage centralized registry for distributed UUID Generation.</li>
          <li>New: Further Clarity of exact octet and bit of var/ver in this spec</li>
          <li>New: Block diagram, bit layout, test vectors for UUIDv4</li>
          <li>New: Block diagram, bit layout, test vectors for UUIDv3</li>
          <li>New: Block diagram, bit layout, test vectors for UUIDv5</li>
          <li>New: Add MD5 Security Considerations reference, RFC6151</li>
          <li>New: Add SHA1 Security Considerations reference, RFC6194</li>
        </ul>
      </section>
    </section>
    <section anchor="format">
      <name>UUID Format</name>
      <t>The UUID format is 16 octets (128 bits); the variant bits in conjunction with the version
bits described in the next sections in determine finer structure.</t>
      <t>UUIDs <bcp14>MAY</bcp14> be represented as binary data or integers.
When in use with URNs or applications, any given 128 bit UUID <bcp14>SHOULD</bcp14>
be represented by the "hex-and-dash" string format consisting of multiple
groups of upper or lowercase alphanumeric hex characters separated by a single dash/hyphen.
When used with databases please refer to <xref target="database_considerations"/>.</t>
      <t>The formal definition of the UUID string representation is provided by the following (ABNF) <xref target="RFC4234"/>.</t>
      <sourcecode type="abnf"><![CDATA[
   UUID                   = 4hexOctet "-"
                            2hexOctet "-"
                            2hexOctet "-"
                            2hexOctet "-"
                            6hexOctet
   hexOctet               = hexDigit hexDigit
   hexDigit =
         "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
         "a" / "b" / "c" / "d" / "e" / "f" /
         "A" / "B" / "C" / "D" / "E" / "F"
]]></sourcecode>
      <t>An example UUID using this textual representation from the previous table observed in <xref target="sampleHexUUID"/>.
Note that in this example the alphabetic characters may be all uppercase, all lowercase or mixe case as per <xref section="2.3" sectionFormat="comma" target="RFC4234"/></t>
      <figure anchor="sampleHexUUID">
        <name>Example Hex UUID</name>
        <artwork><![CDATA[
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
]]></artwork>
      </figure>
      <t>The same UUID from <xref target="sampleHexUUID"/> is represented in Binary <xref target="sampleBinaryUUID"/>, Integer <xref target="sampleIntegerUUID"/> and as a URN <xref target="sampleURNUUID"/> defined by <xref target="RFC8141"/>.</t>
      <figure anchor="sampleBinaryUUID">
        <name>Example Hex UUID</name>
        <artwork><![CDATA[
11111000000111010100111110101110011111011110110000010001110100001010011101100101000000001010000011001001000111100110101111110110
]]></artwork>
      </figure>
      <figure anchor="sampleIntegerUUID">
        <name>Example Hex UUID</name>
        <artwork><![CDATA[
329800735698586629295641978511506172918
]]></artwork>
      </figure>
      <figure anchor="sampleURNUUID">
        <name>Example Hex UUID</name>
        <artwork><![CDATA[
urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
]]></artwork>
      </figure>
      <section anchor="variant_field">
        <name>Variant Field</name>
        <t>The variant field determines the layout of the UUID.  That is, the
interpretation of all other bits in the UUID depends on the setting
of the bits in the variant field.  As such, it could more accurately
be called a type field; we retain the original term for
compatibility.  The variant field consists of a variable number of
the most significant bits of octet 8 of the UUID.</t>
        <t><xref target="table1"/> lists the contents of the variant field, where
the letter "x" indicates a "don't-care" value.</t>
        <table anchor="table1">
          <name>UUID Variants</name>
          <thead>
            <tr>
              <th align="left">Msb0</th>
              <th align="left">Msb1</th>
              <th align="left">Msb2</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">x</td>
              <td align="left">x</td>
              <td align="left">Reserved, NCS backward compatibility.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">x</td>
              <td align="left">The variant specified in this document.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">Reserved, Microsoft Corporation backward compatibility</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
          </tbody>
        </table>
        <t>Interoperability, in any form, with variants other than the one
defined here is not guaranteed, and is not likely to be an issue in
practice.</t>
        <t>Specifically for UUIDs in this document bits 64 and 65 of octet 8 <bcp14>MUST</bcp14> be set to 1 and 0 as per row 2 of <xref target="table1"/>.
As such all bit and field layouts will detail a 2 bit variant entry as guidance.</t>
      </section>
      <section anchor="version_field">
        <name>Version Field</name>
        <t>The version number is in the most significant 4 bits of octet 6.
More specifically bits 48 through 51. The remaining 4 bits of Octet 6 are dynamic.</t>
        <t><xref target="table2"/> lists all of the versions for this UUID variant specified in this document.</t>
        <table anchor="table2">
          <name>UUID variant 10xx (8/9/A/B) versions defined by this specification</name>
          <thead>
            <tr>
              <th align="left">Msb0</th>
              <th align="left">Msb1</th>
              <th align="left">Msb2</th>
              <th align="left">Msb3</th>
              <th align="left">Version</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">Unused</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">The Gregorian time-based UUID from in this document.</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">2</td>
              <td align="left">Reserved for DCE Security version, with embedded POSIX UUIDs.</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">3</td>
              <td align="left">The name-based version specified in this document that uses MD5 hashing.</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">4</td>
              <td align="left">The randomly or pseudo-randomly generated version specified in this document.</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">5</td>
              <td align="left">The name-based version specified in this document that uses SHA-1 hashing.</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">6</td>
              <td align="left">Reordered Gregorian time-based UUID specified in this document.</td>
            </tr>
            <tr>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">7</td>
              <td align="left">Unix Epoch time-based UUID specified in this document.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">8</td>
              <td align="left">Reserved for custom UUID formats specified in this document.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">9</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">10</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">11</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">0</td>
              <td align="left">12</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">1</td>
              <td align="left">13</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">0</td>
              <td align="left">14</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
            <tr>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">1</td>
              <td align="left">15</td>
              <td align="left">Reserved for future definition.</td>
            </tr>
          </tbody>
        </table>
        <t>An example version/variant layout for UUIDv4 follows the table
where M represents the version placement for the hex representation of 4 (0100)
and the N represents the variant placement for one of the four possible hex representation of variant 10x:
8 (1000), 9 (1001), A (1010), B (1011)</t>
        <figure>
          <name>UUIDv4 Variant Examples</name>
          <artwork><![CDATA[
00000000-0000-4000-8000-000000000000
00000000-0000-4000-9000-000000000000
00000000-0000-4000-A000-000000000000
00000000-0000-4000-B000-000000000000
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="layout">
      <name>UUID Layouts</name>
      <t>To minimize confusion about bit assignments within octets and among differing versions,
the UUID record definition is defined only in terms of fields that are
integral numbers of octets.  The fields are presented with the most
significant one first.</t>
      <t>In the absence of explicit application or presentation protocol
specification to the contrary, each field is encoded with the Most
Significant Byte first (known as network byte order).</t>
      <t>Note that in some instances the field names, particularly for multiplexed fields, follow historical
practice.</t>
      <t>While discussing UUID field layouts, bit definitions start at 0 and end at 127 while octets definitions start at 0 and end at 15.</t>
      <section anchor="uuidv1">
        <name>UUID Version 1</name>
        <t>UUID Version 1 is a time-based UUID featuring a 60-bit timestamp
represented by Coordinated Universal Time (UTC) as a count of 100-
nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of
Gregorian reform to the Christian calendar).</t>
        <t>UUID Version 1 also features clock sequence field which is used to help avoid
duplicates that could arise when the clock is set backwards in time
or if the node ID changes.</t>
        <t>Finally the node field consists of an IEEE 802 MAC
address, usually the host address.  For systems with multiple IEEE
802 addresses, any available one can be used.  The lowest addressed
octet (octet number 10) contains the global/local bit and the
unicast/multicast bit, and is the first octet of the address
transmitted on an 802.3 LAN.</t>
        <figure>
          <name>UUIDv1 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          time_low                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       time_mid                |         time_hi_and_version   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         node (2-5)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>time_low:</dt>
          <dd>
            <t>The least significant 32 bits of the 60 bit starting timestamp.
Occupies bits 0 through 31 (octets 0-3)</t>
          </dd>
          <dt>time_mid:</dt>
          <dd>
            <t>The middle 16 bits of the 60 bit starting timestamp.
Occupies bits 32 through 47 (octets 4-5)</t>
          </dd>
          <dt>time_hi_and_version:</dt>
          <dd>
            <t>The first four most significant bits <bcp14>MUST</bcp14> contain
the UUIDv1 version (0001) while the remaining 12 bits will contain
the most significant 12 bits from the 60 bit starting timestamp.
Occupies bits 48 through 63 (octets 6-7)</t>
          </dd>
          <dt>clock_seq_hi_and_res:</dt>
          <dd>
            <t>The first two bits <bcp14>MUST</bcp14> be set to the UUID variant (10)
The remaining 6 bits contain the high portion of the clock sequence.
Occupies bits 64 through 71 (octet 8) for a full 8 bits.</t>
          </dd>
          <dt>clock_seq_low:</dt>
          <dd>
            <t>The 8 bit low portion of the clock sequence.
Occupies bits 72 through 79 (octet 9)</t>
          </dd>
          <dt>node:</dt>
          <dd>
            <t>48 bit spatially unique identifier
Occupies bits 80 through 127 (octets 10-15)</t>
          </dd>
        </dl>
        <t>For systems that do not have UTC available, but do have the local
time, they may use that instead of UTC, as long as they do so
consistently throughout the system.  However, this is not recommended
since generating the UTC from local time only needs a time zone
offset.</t>
        <t>If the clock is set backwards, or might have been set backwards
(e.g., while the system was powered off), and the UUID generator can
not be sure that no UUIDs were generated with timestamps larger than
the value to which the clock was set, then the clock sequence has to
be changed.  If the previous value of the clock sequence is known, it
can just be incremented; otherwise it should be set to a random or
high-quality pseudo-random value.</t>
        <t>Similarly, if the node ID changes (e.g., because a network card has
been moved between machines), setting the clock sequence to a random
number minimizes the probability of a duplicate due to slight
differences in the clock settings of the machines.  If the value of
clock sequence associated with the changed node ID were known, then
the clock sequence could just be incremented, but that is unlikely.</t>
        <t>The clock sequence <bcp14>MUST</bcp14> be originally (i.e., once in the lifetime of
a system) initialized to a random number to minimize the correlation
across systems.  This provides maximum protection against node
identifiers that may move or switch from system to system rapidly.
The initial value <bcp14>MUST NOT</bcp14> be correlated to the node identifier.</t>
        <t>For systems with no IEEE address, a randomly or pseudo-randomly
generated value may be used; see <xref target="unguessability"/> and <xref target="unidentifiable"/>.</t>
      </section>
      <section anchor="uuidv2">
        <name>UUID Version 2</name>
        <t>UUID Version 2 is known as DCE Security UUIDs <xref target="C309"/> and <xref target="C311"/>.
As such the definition of these UUIDs are outside the scope of this specification.</t>
      </section>
      <section anchor="uuidv3">
        <name>UUID Version 3</name>
        <t>UUID Version 3 is meant for generating UUIDs from "names"
that are drawn from, and unique within, some "name space" as per <xref target="name_based_uuid_generation"/>.</t>
        <t>UUIDv3 values are created by computing an MD5 <xref target="RFC1321"/>
hash over a given name space value concatenated with the desired name value
after both have been converted to a canonical sequence of octets in network byte order.
This MD5 value is then uses to populate all 128 bits of the UUID layout.
The UUID version and variant then replace the respective bits as defined by <xref target="version_field"/> and <xref target="variant_field"/>.</t>
        <t>Some common name space values have been defined via <xref target="namespaces"/>.</t>
        <t>Where possible UUIDv5 <bcp14>SHOULD</bcp14> be used in lieu of UUIDv3.
For more information on MD5 security considerations see <xref target="RFC6151"/>.</t>
        <figure>
          <name>UUIDv3 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            md5_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          md5_high             |  ver  |       md5_mid         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        md5_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            md5_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>md5_high:</dt>
          <dd>
            <t>The first 48 bits of the layout are filled
with the most significant, left-most 48 bits
from the computed MD5 value.</t>
          </dd>
          <dt>ver:</dt>
          <dd>
            <t>The 4 bit version field as defined by <xref target="version_field"/></t>
          </dd>
          <dt>md5_mid:</dt>
          <dd>
            <t>12 more bits of the layout consisting of the least significant,
right-most 12 bits of 16 bits immediately following md5_high
from the computed MD5 value.</t>
          </dd>
          <dt>var:</dt>
          <dd>
            <t>The 2 bit variant field as defined by <xref target="variant_field"/>.</t>
          </dd>
          <dt>md5_low:</dt>
          <dd>
            <t>The final 62 bits of the layout immediately following the var field to be
filled with the least-significant, right-most bits of the final 64 bits
from the computed MD5 value.</t>
          </dd>
        </dl>
      </section>
      <section anchor="uuidv4">
        <name>UUID Version 4</name>
        <t>The version 4 UUID is meant for generating UUIDs from truly-random or
pseudo-random numbers.</t>
        <t>An implementation may generate 128 bits of random random data which is
used to fill out the UUID fields in <xref target="uuidv4fields"/>. The UUID version
and variant then replace the respective bits as defined by <xref target="version_field"/>
and <xref target="variant_field"/>,</t>
        <t>Alternatively, an implementation <bcp14>MAY</bcp14> choose to randomly generate the exact required number of bits for
for random_a, random_b, and random_c then concatenate the version and variant in the required position.</t>
        <t>For guidelines on random data generation see <xref target="unguessability"/>.</t>
        <figure anchor="uuidv4fields">
          <name>UUIDv4 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           random_a                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          random_a             |  ver  |       random_b        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                       random_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           random_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>random_a:</dt>
          <dd>
            <t>The first 48 bits of the layout that can be filled with random data as per <xref target="unguessability"/>
fit.</t>
          </dd>
          <dt>ver:</dt>
          <dd>
            <t>The 4 bit version field as defined by <xref target="version_field"/></t>
          </dd>
          <dt>random_b:</dt>
          <dd>
            <t>12 more bits of the layout that can be filled random data as per <xref target="unguessability"/></t>
          </dd>
          <dt>var:</dt>
          <dd>
            <t>The 2 bit variant field as defined by <xref target="variant_field"/>.</t>
          </dd>
          <dt>random_c:</dt>
          <dd>
            <t>The final 62 bits of the layout immediately following the var field to be
filled with random data as per <xref target="unguessability"/></t>
          </dd>
        </dl>
      </section>
      <section anchor="uuidv5">
        <name>UUID Version 5</name>
        <t>UUID Version 5 is meant for generating UUIDs from "names"
that are drawn from, and unique within, some "name space" as per <xref target="name_based_uuid_generation"/>.</t>
        <t>UUIDv5 values are created by computing an SHA1 <xref target="SHA1"/>
hash over a given name space value concatenated with the desired name value
after both have been converted to a canonical sequence of octets in network byte order.
This SHA1 value is then uses to populate all 128 bits of the UUID layout. Excess bits beyond 128 are discarded.
The UUID version and variant then replace the respective bits as defined by <xref target="version_field"/> and <xref target="variant_field"/></t>
        <t>Some common name space values have been defined via <xref target="namespaces"/>.</t>
        <t>For more information on MD5 security considerations see <xref target="RFC6194"/>.</t>
        <figure>
          <name>UUIDv5 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            sha_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          sha_high             |  ver  |       sha_mid         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        sha_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            md5_low                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>sha_high:</dt>
          <dd>
            <t>The first 48 bits of the layout are filled
with the most significant, left-most 48 bits
from the computed SHA1 value.</t>
          </dd>
          <dt>ver:</dt>
          <dd>
            <t>The 4 bit version field as defined by <xref target="version_field"/></t>
          </dd>
          <dt>sha_mid:</dt>
          <dd>
            <t>12 more bits of the layout consisting of the least significant,
right-most 12 bits of 16 bits immediately following md5_high
from the computed SHA1 value.</t>
          </dd>
          <dt>var:</dt>
          <dd>
            <t>The 2 bit variant field as defined by <xref target="variant_field"/>.</t>
          </dd>
          <dt>sha_low:</dt>
          <dd>
            <t>The final 62 bits of the layout immediately following the var field to be
filled by skipping the 2 most significant, left-most bits of the remaining SHA1 hash
and then using the next 62 most significant, left-most bits.
Any leftover SHA1 bits are discarded and unused.</t>
          </dd>
        </dl>
      </section>
      <section anchor="uuidv6">
        <name>UUID Version 6</name>
        <t>UUID version 6 is a field-compatible version of UUIDv1, reordered for improved
DB locality.
It is expected that UUIDv6 will primarily be used in contexts where there
are existing v1 UUIDs.
Systems that do not involve legacy UUIDv1 <bcp14>SHOULD</bcp14> consider using UUIDv7 instead.</t>
        <t>Instead of splitting the timestamp into the low, mid and high sections from
UUIDv1, UUIDv6 changes this sequence so timestamp bytes are stored from most
to least significant.
That is, given a 60 bit timestamp value as specified for UUIDv1 in <xref target="uuidv1"/>,
for UUIDv6, the first 48 most significant bits are stored
first, followed by the 4 bit version (same position), followed by the remaining
12 bits of the original 60 bit timestamp.</t>
        <t>The clock sequence bits remain unchanged from their usage and position in <xref target="uuidv1"/>.</t>
        <t>The 48 bit node <bcp14>SHOULD</bcp14> be set to a pseudo-random value however implementations
<bcp14>MAY</bcp14> choose to retain the old MAC address behavior from <xref target="uuidv1"/> and <xref target="unidentifiable"/>. For more information on MAC address usage within UUIDs see the <xref target="Security"/></t>
        <t>The format for the 16-byte, 128 bit UUIDv6 is shown in <xref target="v6layout"/></t>
        <figure anchor="v6layout">
          <name>UUIDv6 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           time_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           time_mid            |      time_low_and_version     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         node (2-5)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>time_high:</dt>
          <dd>
            <t>The most significant 32 bits of the 60 bit starting timestamp.
Occupies bits 0 through 31 (octets 0-3)</t>
          </dd>
          <dt>time_mid:</dt>
          <dd>
            <t>The middle 16 bits of the 60 bit starting timestamp.
Occupies bits 32 through 47 (octets 4-5)</t>
          </dd>
          <dt>time_low_and_version:</dt>
          <dd>
            <t>The first four most significant bits <bcp14>MUST</bcp14> contain
the UUIDv6 version (0110) while the remaining 12 bits will contain
the least significant 12 bits from the 60 bit starting timestamp.
Occupies bits 48 through 63 (octets 6-7)</t>
          </dd>
          <dt>clk_seq_hi_res:</dt>
          <dd>
            <t>The first two bits <bcp14>MUST</bcp14> be set to the UUID variant (10)
The remaining 6 bits contain the high portion of the clock sequence.
Occupies bits 64 through 71 (octet 8) for a full 8 bits.</t>
          </dd>
          <dt>clock_seq_low:</dt>
          <dd>
            <t>The 8 bit low portion of the clock sequence.
Occupies bits 72 through 79 (octet 9)</t>
          </dd>
          <dt>node:</dt>
          <dd>
            <t>48 bit spatially unique identifier
Occupies bits 80 through 127 (octets 10-15)</t>
          </dd>
        </dl>
        <t>With UUIDv6 the steps for splitting the timestamp into time_high and time_mid
are <bcp14>OPTIONAL</bcp14>
since the 48 bits of time_high and time_mid will remain in the same order.
An extra step of splitting the first 48 bits of the timestamp into the most
significant
32 bits and least significant 16 bits proves useful when reusing an existing
UUIDv1 implementation.</t>
      </section>
      <section anchor="v7">
        <name>UUID Version 7</name>
        <t>UUID version 7 features a time-ordered value field derived from the widely
implemented and well known Unix Epoch timestamp source, the number of milliseconds
seconds since midnight 1 Jan 1970 UTC, leap seconds excluded.
As well as improved entropy characteristics over versions 1 or 6.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> utilize UUID version 7 over UUID version 1 and 6 if
possible.</t>
        <figure>
          <name>UUIDv7 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           unix_ts_ms                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          unix_ts_ms           |  ver  |       rand_a          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                        rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            rand_b                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>unix_ts_ms:</dt>
          <dd>
            <t>48 bit big-endian unsigned number of Unix epoch timestamp as per <xref target="timestamp_granularity"/>.</t>
          </dd>
          <dt>ver:</dt>
          <dd>
            <t>4 bit UUIDv7 version set as per <xref target="version_field"/></t>
          </dd>
          <dt>rand_a:</dt>
          <dd>
            <t>12 bits pseudo-random data to provide uniqueness as per <xref target="monotonicity_counters"/> and <xref target="unguessability"/>.</t>
          </dd>
          <dt>var:</dt>
          <dd>
            <t>The 2 bit variant defined by <xref target="variant_field"/>.</t>
          </dd>
          <dt>rand_b:</dt>
          <dd>
            <t>The final 62 bits of pseudo-random data to provide uniqueness as per <xref target="monotonicity_counters"/> and <xref target="unguessability"/>.</t>
          </dd>
        </dl>
      </section>
      <section anchor="v8">
        <name>UUID Version 8</name>
        <t>UUID version 8 provides an RFC-compatible format for experimental or vendor-specific
use cases.
The only requirement is that the variant and version bits <bcp14>MUST</bcp14> be set as
defined in <xref target="variant_field"/> and <xref target="version_field"/>.
UUIDv8's uniqueness will be implementation-specific and <bcp14>SHOULD NOT</bcp14> be assumed.</t>
        <t>The only explicitly defined bits are the Version and Variant leaving 122
bits
for implementation specific time-based UUIDs. To be clear:
UUIDv8 is not a replacement for UUIDv4 where all 122 extra bits are
filled with random data.</t>
        <t>Some example situations in which UUIDv8 usage could occur:</t>
        <ul spacing="normal">
          <li>An implementation would like to embed extra information
within the UUID other than what is defined in this document.</li>
          <li>An implementation has other application/language restrictions which
inhibit the use of one of the current UUIDs.</li>
        </ul>
        <figure>
          <name>UUIDv8 Field and Bit Layout</name>
          <artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           custom_a                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          custom_a             |  ver  |       custom_b        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                       custom_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           custom_c                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <dl newline="true">
          <dt>custom_a:</dt>
          <dd>
            <t>The first 48 bits of the layout that can be filled as an implementation sees
fit.</t>
          </dd>
          <dt>ver:</dt>
          <dd>
            <t>The 4 bit version field as defined by <xref target="version_field"/></t>
          </dd>
          <dt>custom_b:</dt>
          <dd>
            <t>12 more bits of the layout that can be filled as an implementation sees fit.</t>
          </dd>
          <dt>var:</dt>
          <dd>
            <t>The 2 bit variant field as defined by <xref target="variant_field"/>.</t>
          </dd>
          <dt>custom_c:</dt>
          <dd>
            <t>The final 62 bits of the layout immediately following the var field to be
filled as an implementation sees fit.</t>
          </dd>
        </dl>
      </section>
      <section anchor="niluuid">
        <name>Nil UUID</name>
        <t>The nil UUID is special form of UUID that is specified to have all
128 bits set to zero.</t>
        <figure>
          <name>Nil UUID Format</name>
          <artwork><![CDATA[
00000000-0000-0000-0000-000000000000
]]></artwork>
        </figure>
      </section>
      <section anchor="maxuuid">
        <name>Max UUID</name>
        <t>The Max UUID is special form of UUID that is specified to have all 128 bits
set to 1. This UUID can be thought of as the inverse of Nil UUID defined
in <xref target="niluuid"/>.</t>
        <figure>
          <name>Max UUID Format</name>
          <artwork><![CDATA[
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="uuid_best_practices">
      <name>UUID Best Practices</name>
      <t>The minimum requirements for generating UUIDs are
described in this document for each version.
Everything else is an implementation detail and
up to the implementer to decide what is appropriate for a given
implementation. That being said, various relevant factors are covered
below to help guide an implementer through the different trade-offs among
differing UUID implementations.</t>
      <section anchor="timestamp_granularity">
        <name>Timestamp Granularity</name>
        <t>UUID timestamp source, precision and length was the topic of great debate
while creating UUIDv7 for this specification. As such choosing the right timestamp for
your application is a very important topic. This section will detail some
of the most common points on this topic.</t>
        <dl newline="true">
          <dt>Reliability:</dt>
          <dd>
            <t>Implementations <bcp14>SHOULD</bcp14> use the current timestamp from a reliable source to
provide values that are time-ordered and continually increasing.
Care <bcp14>SHOULD</bcp14> be taken to ensure that timestamp changes from the environment
or operating system are handled in a way that is consistent with implementation
requirements.
For example, if it is possible for the system clock to move backward due
to either manual adjustment or corrections from a time synchronization protocol,
implementations need to determine how to handle such cases. (See Altering, Fuzzing,
or Smearing bullet below.)</t>
          </dd>
          <dt>Source:</dt>
          <dd>
            <t>UUID version 1 and 6 both utilize a Gregorian epoch timestamp while UUIDv7
utilizes a Unix Epoch timestamp. If other timestamp sources or a custom timestamp
epoch are required UUIDv8 <bcp14>SHOULD</bcp14> be leveraged.</t>
          </dd>
          <dt>Sub-second Precision and Accuracy:</dt>
          <dd>
            <t>Many levels of precision exist for timestamps: milliseconds, microseconds,
nanoseconds, and beyond.
Additionally fractional representations of sub-second precision may be desired
to mix various levels of precision in a time-ordered manner.
Furthermore, system clocks themselves have an underlying granularity and
it is frequently less than the precision offered by the operating system.
With UUID version 1 and 6, 100-nanoseconds of precision are present while
UUIDv7 features fixed millisecond level of precision within the Unix epoch
that does not exceed the granularity capable in most modern systems.
For other levels of precision UUIDv8 <bcp14>SHOULD</bcp14> be utilized.
Similar to <xref target="monotonicity_counters"/>, with UUIDv1 or UUIDv6,
a high resolution timestamp can be simulated by keeping a count of
the number of UUIDs that have been generated with the same value of
the system time, and using it to construct the low order bits of the
timestamp.  The count will range between zero and the number of
100-nanosecond intervals per system time interval.</t>
          </dd>
          <dt>Length:</dt>
          <dd>
            <t>The length of a given timestamp directly impacts how long a given UUID will
be valid.
That is, how many timestamp ticks can be contained in a UUID before the maximum
value for the timestamp field is reached.
Care should be given to ensure that the proper length is selected for a given
timestamp.
UUID version 1 and 6 utilize a 60 bit timestamp and UUIDv7 features a 48
bit timestamp.</t>
          </dd>
          <dt>Altering, Fuzzing, or Smearing:</dt>
          <dd>
            <t>Implementations <bcp14>MAY</bcp14> alter the actual timestamp. Some examples included security
considerations around providing a real clock value within a UUID, to correct
inaccurate clocks or to handle leap seconds. This specification makes no
requirement or guarantee about how close the clock value needs to be to actual
time.
If UUIDs do not need to be frequently generated, the UUIDv1 or UUIDv6 timestamp can
simply be the system time multiplied by the number of 100-nanosecond
intervals per system time interval.</t>
          </dd>
          <dt>Padding:</dt>
          <dd>
            <t>When timestamp padding is required, implementations <bcp14>MUST</bcp14> pad the most significant
bits (left-most) bits with zeros. An example is padding the most significant,
left-most bits of a 32 bit Unix timestamp with zero's to fill out the 48
bit timestamp in UUIDv7.</t>
          </dd>
          <dt>Truncating:</dt>
          <dd>
            <t>Similarly, when timestamps need to be truncated: the lower, least significant
bits <bcp14>MUST</bcp14> be used. An example would be truncating a 64 bit Unix timestamp
to the least significant, right-most 48 bits for UUIDv7.</t>
          </dd>
          <dt>Error Handling:</dt>
          <dd>
            <t>If a system overruns the generator by requesting too many UUIDs
within a single system time interval, the UUID service <bcp14>MUST</bcp14> either
return an error, or stall the UUID generator until the system clock
catches up.
Note that if the processors overrun the UUID generation frequently,
additional node identifiers can be allocated to the system, which
will permit higher speed allocation by making multiple UUIDs
potentially available for each time stamp value.
Similar to <xref target="distributed_shared_knowledge"/> techniques</t>
          </dd>
        </dl>
      </section>
      <section anchor="monotonicity_counters">
        <name>Monotonicity and Counters</name>
        <t>Monotonicity is the backbone of time-based sortable UUIDs. Naturally time-based
UUIDs from this document will be monotonic due to an embedded timestamp however
implementations can guarantee additional monotonicity via the concepts covered
in this section.</t>
        <t>Additionally, care <bcp14>SHOULD</bcp14> be taken to ensure UUIDs generated in batches are
also monotonic. That is, if one-thousand UUIDs are generated for the same
timestamp; there is sufficient logic for organizing the creation order of
those one-thousand UUIDs.
For batch UUID creation implementations <bcp14>MAY</bcp14> utilize a monotonic counter which
<bcp14>SHOULD</bcp14> increment for each UUID created during a given timestamp.</t>
        <t>For single-node UUID implementations that do not need to create batches of
UUIDs, the embedded timestamp within UUID version 1, 6, and 7 can provide
sufficient monotonicity guarantees by simply ensuring that timestamp increments
before creating a new UUID. For the topic of Distributed Nodes please refer
to <xref target="distributed_shared_knowledge"/></t>
        <t>Implementations <bcp14>SHOULD</bcp14> choose one method for single-node UUID implementations
that require batch UUID creation.</t>
        <dl newline="true">
          <dt>Fixed-Length Dedicated Counter Bits (Method 1):</dt>
          <dd>
            <t>This references the practice of allocating a specific number of bits in the
UUID layout to the sole purpose of tallying the total number of UUIDs created
during a given UUID timestamp tick.
Positioning of a fixed bit-length counter <bcp14>SHOULD</bcp14> be immediately after the
embedded timestamp. This promotes sortability and allows random data generation
for each counter increment.
With this method rand_a section of UUIDv7 <bcp14>SHOULD</bcp14> be utilized as fixed-length
dedicated counter bits that are incremented by one for every UUID generation.
The trailing random bits generated for each new UUID in rand_b can help produce
unguessable UUIDs. In the event more counter bits are required the most significant,
left-most, bits of rand_b <bcp14>MAY</bcp14> be leveraged as additional counter bits.</t>
          </dd>
          <dt>Monotonic Random (Method 2):</dt>
          <dd>
            <t>With this method the random data is extended to also double as a counter.
This monotonic random can be thought of as a "randomly seeded counter" which
<bcp14>MUST</bcp14> be incremented in the least significant position for each UUID created
on a given timestamp tick.
UUIDv7's rand_b section <bcp14>SHOULD</bcp14> be utilized with this method to handle batch
UUID generation during a single timestamp tick.
The increment value for every UUID generation <bcp14>SHOULD</bcp14> be a random integer
of any desired length larger than zero. It ensures the UUIDs retain the required
level of unguessability characters provided by the underlying entropy.
The increment value <bcp14>MAY</bcp14> be one when the amount of UUIDs generated in a particular
period of time is important and guessability is not an issue. However, it
<bcp14>SHOULD NOT</bcp14> be used by implementations that favor unguessiblity, as the resulting
values are easily guessable.</t>
          </dd>
        </dl>
        <t>The following sub-topics cover topics related solely with creating reliable
fixed-length dedicated counters:</t>
        <dl newline="true">
          <dt>Fixed-Length Dedicated Counter Seeding:</dt>
          <dd>
            <t>Implementations utilizing fixed-length counter method <bcp14>SHOULD</bcp14> randomly initialize
the counter with each new timestamp tick.
However, when the timestamp has not incremented; the counter <bcp14>SHOULD</bcp14> be frozen
and incremented via the desired increment logic.
When utilizing a randomly seeded counter alongside Method 1; the random <bcp14>MAY</bcp14>
be regenerated with each counter increment without impacting sortability.
The downside is that Method 1 is prone to overflows if a counter of adequate
length is not selected or the random data generated leaves little room for
the required number of increments.
Implementations utilizing fixed-length counter method <bcp14>MAY</bcp14> also choose to
randomly initialize a portion counter rather than the entire counter. For
example, a 24 bit counter could have the 23 bits in least-significant, right-most,
position randomly initialized. The remaining most significant, left-most
counter bits are initialized as zero for the sole purpose of guarding against
counter rollovers.</t>
          </dd>
          <dt>Fixed-Length Dedicated Counter Length:</dt>
          <dd>
            <t>Care <bcp14>MUST</bcp14> be taken to select a counter bit-length that can properly handle
the level of timestamp precision in use.
For example, millisecond precision <bcp14>SHOULD</bcp14> require a larger counter than a
timestamp with nanosecond precision.
General guidance is that the counter <bcp14>SHOULD</bcp14> be at least 12 bits but no longer
than 42 bits.
Care <bcp14>SHOULD</bcp14> also be given to ensure that the counter length selected leaves
room for sufficient entropy in the random portion of the UUID after the counter.
This entropy helps improve the unguessability characteristics of UUIDs created
within the batch.</t>
          </dd>
        </dl>
        <t>The following sub-topics cover rollover handling with either type of counter
method:</t>
        <dl newline="true">
          <dt>Counter Rollover Guards:</dt>
          <dd>
            <t>The technique from Fixed-Length Dedicated Counter Seeding which describes
allocating a segment of the fixed-length counter as a rollover guard is also
helpful to mitigate counter rollover issues.
This same technique can be leveraged with Monotonic random counter methods
by ensuring the total length of a possible increment in the least significant,
right most position is less than the total length of the random being incremented.
As such the most significant, left-most, bits can be incremented as rollover
guarding.</t>
          </dd>
          <dt>Counter Rollover Handling:</dt>
          <dd>
            <t>Counter rollovers <bcp14>SHOULD</bcp14> be handled by the application to avoid sorting issues.
The general guidance is that applications that care about absolute monotonicity
and sortability <bcp14>SHOULD</bcp14> freeze the counter and wait for the timestamp to advance
which ensures monotonicity is not broken.
Alternatively, implementations <bcp14>MAY</bcp14> increment the timestamp ahead of the actual
time and reinitialize the counter.</t>
          </dd>
        </dl>
        <t>Implementations <bcp14>MAY</bcp14> use the following logic to ensure UUIDs featuring embedded
counters are monotonic in nature:</t>
        <ol spacing="normal" type="1"><li>Compare the current timestamp against the previously stored timestamp.</li>
          <li>If the current timestamp is equal to the previous timestamp; increment the
  counter according to the desired method.</li>
          <li>If the current timestamp is greater than the previous timestamp; re-initialize
  the desired counter method to the new timestamp and generate new random bytes
  (if the bytes were frozen or being used as the seed for a monotonic counter).</li>
        </ol>
        <t>Implementations <bcp14>SHOULD</bcp14> check if the the currently generated UUID is greater
than the previously generated UUID. If this is not the case then any number
of things could have occurred. Such as, but not limited to, clock rollbacks,
leap second handling or counter rollovers. Applications <bcp14>SHOULD</bcp14> embed sufficient
logic to catch these scenarios and correct the problem ensuring the next
UUID generated is greater than the previous. To handle this scenario, the
general guidance is that application <bcp14>MAY</bcp14> reuse the previous timestamp and
increment the previous counter method.</t>
      </section>
      <section anchor="generator_states">
        <name>UUID Generator States</name>
        <t>The UUID Generator state only needs to be read from stable storage once at boot
time, if it is read into a system-wide shared volatile store (and
updated whenever the stable store is updated).</t>
        <t>If an implementation does not have any stable store available, then
it can always say that the values were unavailable.  This is the
least desirable implementation because it will increase the frequency
of creation of values such as clock sequence, counters or random data which increases the
probability of duplicates.</t>
        <t>For UUIDv1 and UUIDv6, if the node ID can never change (e.g., the net card is inseparable
from the system), or if any change also reinitializes the clock
sequence to a random value, then instead of keeping it in stable
store, the current node ID may be returned</t>
        <t>For UUIDv1 and UUIDv6, the state does not always need to be written to stable store every
time a UUID is generated.  The timestamp in the stable store can be
periodically set to a value larger than any yet used in a UUID.  As
long as the generated UUIDs have timestamps less than that value, and
the clock sequence and node ID remain unchanged, only the shared
volatile copy of the state needs to be updated.  Furthermore, if the
timestamp value in stable store is in the future by less than the
typical time it takes the system to reboot, a crash will not cause a
reinitialization of the clock sequence.</t>
        <t>If it is too expensive to access shared state each time a UUID is
generated, then the system-wide generator can be implemented to
allocate a block of time stamps each time it is called; a per-
process generator can allocate from that block until it is exhausted.</t>
      </section>
      <section anchor="distributed_shared_knowledge">
        <name>Distributed UUID Generation</name>
        <t>Some implementations <bcp14>MAY</bcp14> desire to utilize multi-node, clustered, applications
which involve two or more
nodes independently generating UUIDs that will be stored in a common location.
While UUIDs already feature sufficient entropy to ensure that the chances
of collision are low as the total number of nodes increase; so does the likelihood
of a collision.</t>
        <t>This section will detail the approaches that have been observed by by multi-node
UUID implementations in distributed environments.</t>
        <dl newline="true">
          <dt>Centralized Registry:</dt>
          <dd>
            <t>With this method all nodes tasked with creating UUIDs consult a central registry
and confirm the generated value is unique. As applications scale the communication
with the central registry could become a bottleneck and impact UUID generation
in a negative way. Utilization of shared knowledge schemes with central/global
registries is outside the scope of this specification and should generally be discouraged.</t>
          </dd>
          <dt>Node IDs:</dt>
          <dd>
            <t>With this method, a pseudo-random Node ID value is placed within the UUID
layout.
This identifier helps ensure the bit-space for a given node is unique, resulting
in UUIDs that do not conflict with any other UUID created by another node
with a different node id.
Implementations that choose to leverage an embedded node id <bcp14>SHOULD</bcp14> utilize
UUIDv8.
The node id <bcp14>SHOULD NOT</bcp14> be an IEEE 802 MAC address as per <xref target="Security"/>.
The location and bit length are left to implementations and are outside the
scope of this specification.
Furthermore, the creation and negotiation of unique node ids among nodes
is also out of scope for this specification.</t>
          </dd>
        </dl>
        <t>Utilization of either a Centralized Registry or Node ID are not required
for implementing UUIDs in this specification. However implementations <bcp14>SHOULD</bcp14>
utilize one of the two aforementioned methods if distributed UUID generation
is a requirement.</t>
      </section>
      <section anchor="name_based_uuid_generation">
        <name>Name-Based UUID Generation</name>
        <t>TODO, define how to compute a namespace ID if I don't want to use one from <xref target="namespaces"/></t>
        <t>The concept of name and name space should be broadly construed, and not
limited to textual names.  For example, some name spaces are the
domain name system, URLs, Object Identifiers (OIDs), X.500 Distinguished
Names (DNs), and reserved words in a programming language.  The
mechanisms or conventions used for allocating names and ensuring
their uniqueness within their name spaces are beyond the scope of
this specification.</t>
        <t>The requirements for these types of UUIDs are as follows:</t>
        <ul spacing="normal">
          <li>The UUIDs generated at different times from the same name in the
same namespace <bcp14>MUST</bcp14> be equal.</li>
          <li>The UUIDs generated from two different names in the same namespace
should be different (with very high probability).</li>
          <li>The UUIDs generated from the same name in two different namespaces
should be different (with very high probability).</li>
          <li>If two UUIDs that were generated from names are equal, then they
were generated from the same name in the same namespace (with very
high probability).</li>
        </ul>
      </section>
      <section anchor="collision_resistance">
        <name>Collision Resistance</name>
        <t>Implementations <bcp14>SHOULD</bcp14> weigh the consequences of UUID collisions within their
application and when deciding between UUID versions that use entropy (random)
versus the other components such as <xref target="timestamp_granularity"/> and <xref target="monotonicity_counters"/>.
This is especially true for distributed node collision resistance as defined
by <xref target="distributed_shared_knowledge"/>.</t>
        <t>There are two example scenarios below which help illustrate the varying seriousness
of a collision within an application.</t>
        <dl newline="true">
          <dt>Low Impact</dt>
          <dd>
            <t>A UUID collision generated a duplicate log entry which results in incorrect
statistics derived from the data. Implementations that are not negatively
affected by collisions may continue with the entropy and uniqueness provided
by the traditional UUID format.</t>
          </dd>
          <dt>High Impact:</dt>
          <dd>
            <t>A duplicate key causes an airplane to receive the wrong course which puts
people's lives at risk. In this scenario there is no margin for error. Collisions
<bcp14>MUST</bcp14> be avoided and failure is unacceptable. Applications dealing with this
type of scenario <bcp14>MUST</bcp14> employ as much collision resistance as possible within
the given application context.</t>
          </dd>
        </dl>
      </section>
      <section anchor="global_local_uniqueness">
        <name>Global and Local Uniqueness</name>
        <t>UUIDs created by this specification <bcp14>MAY</bcp14> be used to provide local uniqueness
guarantees.
For example, ensuring UUIDs created within a local application context are
unique within a database <bcp14>MAY</bcp14> be sufficient for some implementations where
global uniqueness outside of the application context, in other applications,
or around the world is not required.</t>
        <t>Although true global uniqueness is impossible to guarantee without a shared
knowledge scheme; a shared knowledge scheme is not required by UUID to provide
uniqueness guarantees.
Implementations <bcp14>MAY</bcp14> implement a shared knowledge scheme introduced in <xref target="distributed_shared_knowledge"/> as they see fit to extend the uniqueness guaranteed this specification.</t>
      </section>
      <section anchor="unguessability">
        <name>Unguessability</name>
        <t>TODO: Here or in security considerations, discuss security considerations with with "running out of random"</t>
        <t>Implementations <bcp14>SHOULD</bcp14> utilize a cryptographically secure pseudo-random number
generator (CSPRNG) to provide values that are both difficult to predict ("unguessable")
and have a low likelihood of collision ("unique").
Care <bcp14>SHOULD</bcp14> be taken to ensure the CSPRNG state is properly reseeded upon
state changes, such as process forks, to ensure proper CSPRNG operation.
CSPRNG ensures the best of <xref target="collision_resistance"/> and <xref target="Security"/> are present in modern UUIDs.</t>
        <t>Further advice on generating cryptographic-quality random numbers can be found in <xref target="RFC4086"/></t>
      </section>
      <section anchor="unidentifiable">
        <name>UUIDs that Do Not Identify the Host</name>
        <t>This section describes how to generate a UUIDv1 or UUIDv6 value if an IEEE
802 address is not available, or its use is not desired.</t>
        <t>One approach is to contact the IEEE and get a separate block of
addresses.  At the time of writing, the application could be found at
<eref target="https://standards.ieee.org/products-programs/regauth/"/>.</t>
        <t>A better solution is to obtain a 47-bit cryptographic quality random
number and use it as the low 47 bits of the node ID, with the least
significant bit of the first octet of the node ID set to one.  This
bit is the unicast/multicast bit, which will never be set in IEEE 802
addresses obtained from network cards.  Hence, there can never be a
conflict between UUIDs generated by machines with and without network
cards.  (Recall that the IEEE 802 spec talks about transmission
order, which is the opposite of the in-memory representation that is
discussed in this document.)</t>
        <t>For compatibility with earlier specifications, note that this
document uses the unicast/multicast bit, instead of the arguably more
correct local/global bit.</t>
        <t>In addition, items such as the computer's name and the name of the
operating system, while not strictly speaking random, will help
differentiate the results from those obtained by other systems.</t>
        <t>The exact algorithm to generate a node ID using these data is system
specific, because both the data available and the functions to obtain
them are often very system specific.  A generic approach, however, is
to accumulate as many sources as possible into a buffer, use a
message digest such as MD5 <xref target="RFC1321"/> or SHA-1 <xref target="SHA1"/>, take an arbitrary 6
bytes from the hash value, and set the multicast bit as described
above.</t>
      </section>
      <section anchor="sorting">
        <name>Sorting</name>
        <t>UUIDv6 and UUIDv7 are designed so that implementations that require sorting
(e.g. database indexes) <bcp14>SHOULD</bcp14> sort as opaque raw bytes, without need for
parsing or introspection.</t>
        <t>Time ordered monotonic UUIDs benefit from greater database index locality
because the new values are near each other in the index.
As a result objects are more easily clustered together for better performance.
The real-world differences in this approach of index locality vs random data
inserts can be quite large.</t>
        <t>UUIDs formats created by this specification <bcp14>SHOULD</bcp14> be Lexicographically sortable
while in the textual representation.</t>
        <t>UUIDs created by this specification are crafted with big-ending byte order
(network byte order) in mind. If Little-endian style is required a custom
UUID format <bcp14>SHOULD</bcp14> be created using UUIDv8.</t>
      </section>
      <section anchor="opacity">
        <name>Opacity</name>
        <t>UUIDs <bcp14>SHOULD</bcp14> be treated as opaque values and implementations <bcp14>SHOULD NOT</bcp14> examine
the bits in a UUID to whatever extent is possible. However, where necessary,
inspectors should refer to <xref target="variant_field"/> and <xref target="version_field"/> for more information on determining UUID version and variant.</t>
      </section>
      <section anchor="database_considerations">
        <name>DBMS and Database Considerations</name>
        <t>For many applications, such as databases, storing UUIDs as text is unnecessarily
verbose, requiring 288 bits to represent 128 bit UUID values.
Thus, where feasible, UUIDs <bcp14>SHOULD</bcp14> be stored within database applications
as the underlying 128 bit binary value.</t>
        <t>For other systems, UUIDs <bcp14>MAY</bcp14> be stored in binary form or as text, as appropriate.
The trade-offs to both approaches are as such:</t>
        <ul spacing="normal">
          <li>Storing as binary requires less space and may result in faster data access.</li>
          <li>Storing as text requires more space but may require less translation if the
resulting text form is to be used after retrieval and thus maybe simpler
to implement.</li>
        </ul>
        <t>DBMS vendors are encouraged to provide functionality to generate and store
UUID formats defined by this specification for use as identifiers or left
parts of identifiers such as, but not limited to, primary keys, surrogate
keys for temporal databases, foreign keys included in polymorphic relationships,
and keys for key-value pairs in JSON columns and key-value databases.
Applications using a monolithic database may find using database-generated
UUIDs (as opposed to client-generate UUIDs) provides the best UUID monotonicity.
In addition to UUIDs, additional identifiers <bcp14>MAY</bcp14> be used to ensure integrity
and feedback.</t>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>TODO: Q: Should Namespace Registration Template be here or in <xref target="namespace_reg_template"/>?
TODO: Need to ensure IANA doc, https://www.iana.org/assignments/urn-namespaces/urn-namespaces.xhtml, has this new document listed.</t>
    </section>
    <section anchor="community">
      <name>Community Considerations</name>
      <t>The use of UUIDs is extremely pervasive in computing.  They comprise
the core identifier infrastructure for many operating systems
(Microsoft Windows) and applications (the Mozilla browser) and in
many cases, become exposed to the Web in many non-standard ways.</t>
      <t>This specification attempts to standardize that practice as openly as
possible and in a way that attempts to benefit the entire Internet.</t>
    </section>
    <section anchor="Security">
      <name>Security Considerations</name>
      <t>Do not assume that UUIDs are hard to guess; they should not be used
as security capabilities (identifiers whose mere possession grants
access), for example.  A predictable random number source will
exacerbate the situation.</t>
      <t>Do not assume that it is easy to determine if a UUID has been
slightly transposed in order to redirect a reference to another
object.  Humans do not have the ability to easily check the integrity
of a UUID by simply glancing at it.</t>
      <t>Distributed applications generating UUIDs at a variety of hosts must
be willing to rely on the random number source at all hosts.  If this
is not feasible, the namespace variant should be used.</t>
      <t>MAC addresses pose inherent security risks and <bcp14>SHOULD</bcp14> not be used within
a UUID.
Instead CSPRNG data <bcp14>SHOULD</bcp14> be selected from a source with sufficient entropy
to ensure guaranteed
uniqueness among UUID generation. See <xref target="unguessability"/> for more information.</t>
      <t>Timestamps embedded in the UUID do pose a very small attack surface. The
timestamp in conjunction with
an embedded counter does signal the order of creation for a given UUID and
it's corresponding data but
does not define anything about the data itself or the application as a whole.
If UUIDs are required for
use with any security operation within an application context in any shape
or form then UUIDv4, <xref target="uuidv4"/> <bcp14>SHOULD</bcp14> be utilized.</t>
      <t>See <xref target="RFC6151"/> for MD5 Security Considerations and <xref target="RFC6194"/> for SHA1 security considerations.</t>
    </section>
    <section anchor="Acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors gratefully acknowledge the contributions of Rich Salz,
Ben Campbell,
Ben Ramsey,
Fabio Lima,
Gonzalo Salgueiro,
Martin Thomson,
Murray S. Kucherawy,
Rick van Rein,
Rob Wilton,
Sean Leonard,
Theodore Y. Ts'o.,
Robert Kieffer,
sergeyprokhorenko,
LiosK</t>
      <t>As well as all of those in the IETF community and on GitHub to who contributed
to the discussions which resulted in this document.</t>
      <t>This document draws heavily on the OSF DCE specification for UUIDs.
Ted Ts'o provided helpful comments, especially on the byte ordering
section which we mostly plagiarized from a proposed wording he
supplied (all errors in that section are our responsibility,
however).</t>
      <t>We are also grateful to the careful reading and bit-twiddling of Ralf
S. Engelschall, John Larmouth, and Paul Thorpe.  Professor Larmouth
was also invaluable in achieving coordination with ISO/IEC.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="NCA">
          <front>
            <title>Network Computing Architecture</title>
            <author initials="L." surname="Zahn" fullname="L. Zahn">
              <organization/>
            </author>
            <author initials="T." surname="Dineen" fullname="T. Dineen">
              <organization/>
            </author>
            <author initials="P." surname="Leach" fullname="P. Leach">
              <organization/>
            </author>
            <date year="1990" month="January"/>
          </front>
          <seriesInfo name="ISBN" value="0-13-611674-4"/>
        </reference>
        <reference anchor="C309" target="https://pubs.opengroup.org/onlinepubs/9696999099/toc.pdf">
          <front>
            <title>DCE: Remote Procedure Call</title>
            <author>
              <organization/>
            </author>
            <date year="1994" month="August"/>
          </front>
          <seriesInfo name="ISBN" value="1-85912-041-5"/>
          <refcontent>Open Group CAE Specification C309</refcontent>
        </reference>
        <reference anchor="X667">
          <front>
            <title>Information Technology, "Procedures for the operation of OSI Registration Authorities: Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components"</title>
            <author>
              <organization/>
            </author>
            <date year="2004"/>
          </front>
          <seriesInfo name="ISO/IEC" value="9834-8:2004"/>
          <seriesInfo name="ITU-T Rec." value="X.667"/>
        </reference>
        <reference anchor="RFC1321" target="https://www.rfc-editor.org/info/rfc1321">
          <front>
            <title>The MD5 Message-Digest Algorithm</title>
            <author fullname="R. Rivest" initials="R." surname="Rivest">
              <organization/>
            </author>
            <date month="April" year="1992"/>
            <abstract>
              <t>This document describes the MD5 message-digest algorithm. The algorithm takes as input a message of arbitrary length and produces as output a 128-bit "fingerprint" or "message digest" of the input.  This memo provides information for the Internet community.  It does not specify an Internet standard.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="1321"/>
          <seriesInfo name="DOI" value="10.17487/RFC1321"/>
        </reference>
        <reference anchor="RFC6151" target="https://www.rfc-editor.org/info/rfc6151">
          <front>
            <title>Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms</title>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <author fullname="L. Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <date month="March" year="2011"/>
            <abstract>
              <t>This document updates the security considerations for the MD5 message digest algorithm.  It also updates the security considerations for HMAC-MD5.  This document is not an Internet Standards Track  specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6151"/>
          <seriesInfo name="DOI" value="10.17487/RFC6151"/>
        </reference>
        <reference anchor="RFC4086" target="https://www.rfc-editor.org/info/rfc4086">
          <front>
            <title>Randomness Requirements for Security</title>
            <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd">
              <organization/>
            </author>
            <author fullname="J. Schiller" initials="J." surname="Schiller">
              <organization/>
            </author>
            <author fullname="S. Crocker" initials="S." surname="Crocker">
              <organization/>
            </author>
            <date month="June" year="2005"/>
            <abstract>
              <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts.  However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities.  The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
              <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult.  This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities.  It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="106"/>
          <seriesInfo name="RFC" value="4086"/>
          <seriesInfo name="DOI" value="10.17487/RFC4086"/>
        </reference>
        <reference anchor="RFC8141" target="https://www.rfc-editor.org/info/rfc8141">
          <front>
            <title>Uniform Resource Names (URNs)</title>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre">
              <organization/>
            </author>
            <author fullname="J. Klensin" initials="J." surname="Klensin">
              <organization/>
            </author>
            <date month="April" year="2017"/>
            <abstract>
              <t>A Uniform Resource Name (URN) is a Uniform Resource Identifier (URI) that is assigned under the "urn" URI scheme and a particular URN namespace, with the intent that the URN will be a persistent, location-independent resource identifier.  With regard to URN syntax, this document defines the canonical syntax for URNs (in a way that is consistent with URI syntax), specifies methods for determining URN-equivalence, and discusses URI conformance.  With regard to URN namespaces, this document specifies a method for defining a URN namespace and associating it with a namespace identifier, and it describes procedures for registering namespace identifiers with the Internet Assigned Numbers Authority (IANA).  This document obsoletes both RFCs 2141 and 3406.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8141"/>
          <seriesInfo name="DOI" value="10.17487/RFC8141"/>
        </reference>
        <reference anchor="RFC4234" target="https://www.rfc-editor.org/info/rfc4234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker">
              <organization/>
            </author>
            <author fullname="P. Overell" initials="P." surname="Overell">
              <organization/>
            </author>
            <date month="October" year="2005"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF.  It balances compactness and simplicity, with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4234"/>
          <seriesInfo name="DOI" value="10.17487/RFC4234"/>
        </reference>
        <reference anchor="RFC6194" target="https://www.rfc-editor.org/info/rfc6194">
          <front>
            <title>Security Considerations for the SHA-0 and SHA-1 Message-Digest Algorithms</title>
            <author fullname="T. Polk" initials="T." surname="Polk">
              <organization/>
            </author>
            <author fullname="L. Chen" initials="L." surname="Chen">
              <organization/>
            </author>
            <author fullname="S. Turner" initials="S." surname="Turner">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="March" year="2011"/>
            <abstract>
              <t>This document includes security considerations for the SHA-0 and SHA-1 message digest algorithm.  This document is not an Internet  Standards Track specification; it is published for informational  purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6194"/>
          <seriesInfo name="DOI" value="10.17487/RFC6194"/>
        </reference>
        <reference anchor="SHA1" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
          <front>
            <title>Secure Hash Standard</title>
            <author>
              <organization>National Institute of Standards and Technology</organization>
            </author>
            <date year="2015" month="August"/>
          </front>
          <seriesInfo name="FIPS" value="PUB 180-4"/>
        </reference>
        <reference anchor="C311" target="https://pubs.opengroup.org/onlinepubs/9696989899/toc.pdf">
          <front>
            <title>DCE 1.1: Authentication and Security Services</title>
            <author>
              <organization/>
            </author>
            <date year="1997"/>
          </front>
          <refcontent>Open Group CAE Specification C311</refcontent>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="LexicalUUID" target="https://github.com/twitter-archive/cassie">
          <front>
            <title>A Scala client for Cassandra</title>
            <author>
              <organization>Twitter</organization>
            </author>
            <date year="2012" month="November"/>
          </front>
          <seriesInfo name="commit" value="f6da4e0"/>
        </reference>
        <reference anchor="Snowflake" target="https://github.com/twitter-archive/snowflake/releases/tag/snowflake-2010">
          <front>
            <title>Snowflake is a network service for generating unique ID numbers at high scale with some simple guarantees.</title>
            <author>
              <organization>Twitter</organization>
            </author>
            <date year="2014" month="May"/>
          </front>
          <seriesInfo name="Commit" value="b3f6a3c"/>
        </reference>
        <reference anchor="Flake" target="https://github.com/boundary/flake">
          <front>
            <title>Flake: A decentralized, k-ordered id generation service in Erlang</title>
            <author>
              <organization>Boundary</organization>
            </author>
            <date year="2017" month="February"/>
          </front>
          <seriesInfo name="Commit" value="15c933a"/>
        </reference>
        <reference anchor="ShardingID" target="https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c">
          <front>
            <title>Sharding &amp; IDs at Instagram</title>
            <author>
              <organization>Instagram Engineering</organization>
            </author>
            <date year="2012" month="December"/>
          </front>
        </reference>
        <reference anchor="KSUID" target="https://github.com/segmentio/ksuid">
          <front>
            <title>K-Sortable Globally Unique IDs</title>
            <author>
              <organization>Segment</organization>
            </author>
            <date year="2020" month="July"/>
          </front>
          <seriesInfo name="Commit" value="bf376a7"/>
        </reference>
        <reference anchor="Elasticflake" target="https://github.com/ppearcy/elasticflake">
          <front>
            <title>Sequential UUID / Flake ID generator pulled out of elasticsearch common</title>
            <author initials="P." surname="Pearcy" fullname="Paul Pearcy">
              <organization/>
            </author>
            <date year="2015" month="January"/>
          </front>
          <seriesInfo name="Commit" value="dd71c21"/>
        </reference>
        <reference anchor="FlakeID" target="https://github.com/T-PWK/flake-idgen">
          <front>
            <title>Flake ID Generator</title>
            <author initials="T." surname="Pawlak" fullname="Tom Pawlak">
              <organization/>
            </author>
            <date year="2020" month="April"/>
          </front>
          <seriesInfo name="Commit" value="fcd6a2f"/>
        </reference>
        <reference anchor="Sonyflake" target="https://github.com/sony/sonyflake">
          <front>
            <title>A distributed unique ID generator inspired by Twitter's Snowflake</title>
            <author>
              <organization>Sony</organization>
            </author>
            <date year="2020" month="August"/>
          </front>
          <seriesInfo name="Commit" value="848d664"/>
        </reference>
        <reference anchor="orderedUuid" target="https://itnext.io/laravel-the-mysterious-ordered-uuid-29e7500b4f8">
          <front>
            <title>Laravel: The mysterious "Ordered UUID"</title>
            <author initials="I. B." surname="Cabrera" fullname="Italo Baeza Cabrera">
              <organization/>
            </author>
            <date year="2020" month="January"/>
          </front>
        </reference>
        <reference anchor="COMBGUID" target="https://github.com/richardtallent/RT.Comb">
          <front>
            <title>Creating sequential GUIDs in C# for MSSQL or PostgreSql</title>
            <author initials="R." surname="Tallent" fullname="Richard Tallent">
              <organization/>
            </author>
            <date year="2020" month="December"/>
          </front>
          <seriesInfo name="Commit" value="2759820"/>
        </reference>
        <reference anchor="ULID" target="https://github.com/ulid/spec">
          <front>
            <title>Universally Unique Lexicographically Sortable Identifier</title>
            <author initials="A." surname="Feerasta" fullname="Alizain Feerasta">
              <organization/>
            </author>
            <date year="2019" month="May"/>
          </front>
          <seriesInfo name="Commit" value="d0c7170"/>
        </reference>
        <reference anchor="SID" target="https://github.com/chilts/sid">
          <front>
            <title>sid : generate sortable identifiers</title>
            <author initials="A." surname="Chilton" fullname="Andrew Chilton">
              <organization/>
            </author>
            <date year="2019" month="June"/>
          </front>
          <seriesInfo name="Commit" value="660e947"/>
        </reference>
        <reference anchor="pushID" target="https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html">
          <front>
            <title>The 2^120 Ways to Ensure Unique Identifiers</title>
            <author>
              <organization>Google</organization>
            </author>
            <date year="2015" month="February"/>
          </front>
        </reference>
        <reference anchor="XID" target="https://github.com/rs/xid">
          <front>
            <title>Globally Unique ID Generator</title>
            <author initials="O." surname="Poitrey" fullname="Olivier Poitrey">
              <organization/>
            </author>
            <date year="2020" month="October"/>
          </front>
          <seriesInfo name="Commit" value="efa678f"/>
        </reference>
        <reference anchor="ObjectID" target="https://docs.mongodb.com/manual/reference/method/ObjectId/">
          <front>
            <title>ObjectId - MongoDB Manual</title>
            <author>
              <organization>MongoDB</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="CUID" target="https://github.com/ericelliott/cuid">
          <front>
            <title>Collision-resistant ids optimized for horizontal scaling and performance.</title>
            <author initials="E." surname="Elliott" fullname="Eric Elliott">
              <organization/>
            </author>
            <date year="2020" month="October"/>
          </front>
          <seriesInfo name="Commit" value="215b27b"/>
        </reference>
        <reference anchor="IEEE754" target="https://standards.ieee.org/ieee/754/6210/">
          <front>
            <title>IEEE Standard for Floating-Point Arithmetic.</title>
            <author>
              <organization>IEEE</organization>
            </author>
            <date year="2019" month="July"/>
          </front>
          <seriesInfo name="Series" value="754-2019"/>
        </reference>
      </references>
    </references>
    <section anchor="namespace_reg_template">
      <name>Namespace Registration Template</name>
      <t>TODO: Revise as per https://www.rfc-editor.org/rfc/rfc8141#appendix-A and https://www.rfc-editor.org/rfc/rfc8141#section-6.2</t>
      <dl newline="true">
        <dt>Namespace ID:</dt>
        <dd>
          <t>UUID</t>
        </dd>
        <dt>Registration Information:</dt>
        <dd>
          <t>Registration date: 2003-10-01</t>
        </dd>
        <dt>Declared registrant of the namespace:</dt>
        <dd>
          <t>JTC 1/SC6 (ASN.1 Rapporteur Group)</t>
        </dd>
        <dt>Declaration of syntactic structure:</dt>
        <dd>
          <t>A UUID is an identifier that is unique across both space and time,
with respect to the space of all UUIDs.  Since a UUID is a fixed
size and contains a time field, it is possible for values to
rollover (around A.D. 3400, depending on the specific algorithm
used).  A UUID can be used for multiple purposes, from tagging
objects with an extremely short lifetime, to reliably identifying
very persistent objects across a network.
</t>
          <t>The internal representation of a UUID is a specific sequence of
bits in memory, as described in <xref target="format"/>.  To accurately
represent a UUID as a URN, it is necessary to convert the bit
sequence to a string representation.</t>
          <t>Each field is treated as an integer and has its value printed as a
zero-filled hexadecimal digit string with the most significant
digit first.  The hexadecimal values "a" through "f" are output as
lower case characters and are case insensitive on input.</t>
          <t>The formal definition of the UUID string representation is
provided by the following ABNF <xref target="RFC4234"/>:</t>
        </dd>
      </dl>
      <sourcecode type="abnf"><![CDATA[
UUID                   = time-low "-" time-mid "-"
                         time-high-and-version "-"
                         clock-seq-and-reserved
                         clock-seq-low "-" node
time-low               = 4hexOctet
time-mid               = 2hexOctet
time-high-and-version  = 2hexOctet
clock-seq-and-reserved = hexOctet
clock-seq-low          = hexOctet
node                   = 6hexOctet
hexOctet               = hexDigit hexDigit
hexDigit =
      "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" /
      "a" / "b" / "c" / "d" / "e" / "f" /
      "A" / "B" / "C" / "D" / "E" / "F"
]]></sourcecode>
      <t>The following is an example of the string representation of a UUID as
  a URN:</t>
      <t>urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6</t>
      <dl>
        <dt>Relevant ancillary documentation:</dt>
        <dd>
          <t><xref target="NCA"/><xref target="C309"/></t>
        </dd>
        <dt>Identifier uniqueness considerations:</dt>
        <dd>
          <t>This document specifies three algorithms to generate UUIDs: the
first leverages the unique values of 802 MAC addresses to
guarantee uniqueness, the second uses pseudo-random number
generators, and the third uses cryptographic hashing and
application-provided text strings.  As a result, the UUIDs
generated according to the mechanisms here will be unique from all
other UUIDs that have been or will be assigned.</t>
        </dd>
        <dt>Identifier persistence considerations:</dt>
        <dd>
          <t>UUIDs are inherently very difficult to resolve in a global sense.
This, coupled with the fact that UUIDs are temporally unique
within their spatial context, ensures that UUIDs will remain as
persistent as possible.</t>
        </dd>
        <dt>Process of identifier assignment:</dt>
        <dd>
          <t>Generating a UUID does not require that a registration authority
be contacted.  One algorithm requires a unique value over space
for each generator.  This value is typically an IEEE 802 MAC
address, usually already available on network-connected hosts.
The address can be assigned from an address block obtained from
the IEEE registration authority.  If no such address is available,
or privacy concerns make its use undesirable, <xref target="unidentifiable"/> specifies
two alternatives.  Another approach is to use version 3
or version 4 UUIDs as defined below.</t>
        </dd>
        <dt>Process for identifier resolution:</dt>
        <dd>
          <t>Since UUIDs are not globally resolvable, this is not applicable.</t>
        </dd>
        <dt>Rules for Lexical Equivalence:</dt>
        <dd>
          <t>Consider each field of the UUID to be an unsigned integer as shown
in the tables in section <xref target="layout"/>.  Then, to compare a pair of
UUIDs, arithmetically compare the corresponding fields from each
UUID in order of significance and according to their data type.
Two UUIDs are equal if and only if all the corresponding fields
are equal.
</t>
          <t>As an implementation note, equality comparison can be performed on
many systems by doing the appropriate byte-order canonicalization,
and then treating the two UUIDs as 128-bit unsigned integers.</t>
          <t>UUIDs, as defined in this document, can also be ordered
lexicographically.  For a pair of UUIDs, the first one follows the
second if the most significant field in which the UUIDs differ is
greater for the first UUID.  The second follows the first if the
most significant field in which the UUIDs differ is greater for
the second UUID.</t>
        </dd>
        <dt>Conformance with URN Syntax:</dt>
        <dd>
          <t>The string representation of a UUID is fully compatible with the
URN syntax.  When converting from a bit-oriented, in-memory
representation of a UUID into a URN, care must be taken to
strictly adhere to the byte order issues mentioned in the string
representation section.</t>
        </dd>
        <dt>Validation mechanism:</dt>
        <dd>
          <t>Apart from determining whether the timestamp portion of the UUID
is in the future and therefore not yet assignable, there is no
mechanism for determining whether a UUID is 'valid'.</t>
        </dd>
        <dt>Scope:</dt>
        <dd>
          <t>UUIDs are global in scope.</t>
        </dd>
      </dl>
    </section>
    <section anchor="example_code">
      <name>Example Code</name>
      <section anchor="sample_implementation">
        <name>Creating UUIDv1 through UUIDv5 Value</name>
        <t>This implementation consists of 5 files: uuid.h, uuid.c, sysdep.h,
sysdep.c and utest.c.  The uuid.* files are the system independent
implementation of the UUID generation algorithms described above,
with all the optimizations described above except efficient state
sharing across processes included.  The code has been tested on Linux
(Red Hat 4.0) with GCC (2.7.2), and Windows NT 4.0 with VC++ 5.0.
The code assumes 64-bit integer support, which makes it much clearer.</t>
        <t>All the following source files should have the following copyright
notice included:</t>
        <t>copyrt.h</t>
        <artwork><![CDATA[
/*
** Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
** Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
** Digital Equipment Corporation, Maynard, Mass.
** Copyright (c) 1998 Microsoft.
** To anyone who acknowledges that this file is provided "AS IS"
** without any express or implied warranty: permission to use, copy,
** modify, and distribute this file for any purpose is hereby
** granted without fee, provided that the above copyright notices and
** this notice appears in all source code copies, and that none of
** the names of Open Software Foundation, Inc., Hewlett-Packard
** Company, or Digital Equipment Corporation be used in advertising
** or publicity pertaining to distribution of the software without
** specific, written prior permission. Neither Open Software
** Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital
** Equipment Corporation makes any representations about the
** suitability of this software for any purpose.
*/

]]></artwork>
        <t>uuid.h</t>
        <artwork><![CDATA[
#include "copyrt.h"
#undef uuid_t
typedef struct {
    unsigned32  time_low;
    unsigned16  time_mid;
    unsigned16  time_hi_and_version;
    unsigned8   clock_seq_hi_and_reserved;
    unsigned8   clock_seq_low;
    byte        node[6];
} uuid_t;

/* uuid_create -- generate a UUID */
int uuid_create(uuid_t * uuid);

/* uuid_create_md5_from_name -- create a version 3 (MD5) UUID using a
   "name" from a "name space" */
void uuid_create_md5_from_name(
    uuid_t *uuid,         /* resulting UUID */
    uuid_t nsid,          /* UUID of the namespace */
    void *name,           /* the name from which to generate a UUID */
    int namelen           /* the length of the name */
);

/* uuid_create_sha1_from_name -- create a version 5 (SHA-1) UUID
   using a "name" from a "name space" */
void uuid_create_sha1_from_name(

    uuid_t *uuid,         /* resulting UUID */
    uuid_t nsid,          /* UUID of the namespace */
    void *name,           /* the name from which to generate a UUID */
    int namelen           /* the length of the name */
);

/* uuid_compare --  Compare two UUID's "lexically" and return
        -1   u1 is lexically before u2
         0   u1 is equal to u2
         1   u1 is lexically after u2
   Note that lexical ordering is not temporal ordering!
*/
int uuid_compare(uuid_t *u1, uuid_t *u2);
]]></artwork>
        <t>uuid.c</t>
        <artwork><![CDATA[
#include "copyrt.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sysdep.h"
#include "uuid.h"

/* various forward declarations */
static int read_state(unsigned16 *clockseq, uuid_time_t *timestamp,
    uuid_node_t *node);
static void write_state(unsigned16 clockseq, uuid_time_t timestamp,
    uuid_node_t node);
static void format_uuid_v1(uuid_t *uuid, unsigned16 clockseq,
    uuid_time_t timestamp, uuid_node_t node);
static void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16],
    int v);
static void get_current_time(uuid_time_t *timestamp);
static unsigned16 true_random(void);

/* uuid_create -- generate a UUID */
int uuid_create(uuid_t *uuid)
{
     uuid_time_t timestamp, last_time;
     unsigned16 clockseq;
     uuid_node_t node;
     uuid_node_t last_node;
     int f;

     /* acquire system-wide lock so we're alone */
     LOCK;
     /* get time, node ID, saved state from non-volatile storage */
     get_current_time(&timestamp);
     get_ieee_node_identifier(&node);
     f = read_state(&clockseq, &last_time, &last_node);

     /* if no NV state, or if clock went backwards, or node ID
        changed (e.g., new network card) change clockseq */
     if (!f || memcmp(&node, &last_node, sizeof node))
         clockseq = true_random();
     else if (timestamp < last_time)
         clockseq++;

     /* save the state for next time */
     write_state(clockseq, timestamp, node);

     UNLOCK;

     /* stuff fields into the UUID */
     format_uuid_v1(uuid, clockseq, timestamp, node);
     return 1;
}

/* format_uuid_v1 -- make a UUID from the timestamp, clockseq,
                     and node ID */
void format_uuid_v1(uuid_t* uuid, unsigned16 clock_seq,
                    uuid_time_t timestamp, uuid_node_t node)
{
    /* Construct a version 1 uuid with the information we've gathered
       plus a few constants. */
    uuid->time_low = (unsigned long)(timestamp & 0xFFFFFFFF);
    uuid->time_mid = (unsigned short)((timestamp >> 32) & 0xFFFF);
    uuid->time_hi_and_version =
        (unsigned short)((timestamp >> 48) & 0x0FFF);
    uuid->time_hi_and_version |= (1 << 12);
    uuid->clock_seq_low = clock_seq & 0xFF;
    uuid->clock_seq_hi_and_reserved = (clock_seq & 0x3F00) >> 8;
    uuid->clock_seq_hi_and_reserved |= 0x80;
    memcpy(&uuid->node, &node, sizeof uuid->node);
}

/* data type for UUID generator persistent state */
typedef struct {
    uuid_time_t  ts;       /* saved timestamp */
    uuid_node_t  node;     /* saved node ID */
    unsigned16   cs;       /* saved clock sequence */
} uuid_state;

static uuid_state st;

/* read_state -- read UUID generator state from non-volatile store */
int read_state(unsigned16 *clockseq, uuid_time_t *timestamp,
               uuid_node_t *node)
{
    static int inited = 0;
    FILE *fp;

    /* only need to read state once per boot */
    if (!inited) {
        fp = fopen("state", "rb");
        if (fp == NULL)
            return 0;
        fread(&st, sizeof st, 1, fp);
        fclose(fp);
        inited = 1;
    }
    *clockseq = st.cs;
    *timestamp = st.ts;
    *node = st.node;
    return 1;
}

/* write_state -- save UUID generator state back to non-volatile
   storage */
void write_state(unsigned16 clockseq, uuid_time_t timestamp,
                 uuid_node_t node)
{
    static int inited = 0;
    static uuid_time_t next_save;
    FILE* fp;

    if (!inited) {
        next_save = timestamp;
        inited = 1;
    }

    /* always save state to volatile shared state */
    st.cs = clockseq;
    st.ts = timestamp;
    st.node = node;
    if (timestamp >= next_save) {
        fp = fopen("state", "wb");
        fwrite(&st, sizeof st, 1, fp);
        fclose(fp);
        /* schedule next save for 10 seconds from now */
        next_save = timestamp + (10 * 10 * 1000 * 1000);
    }
}

/* get-current_time -- get time as 60-bit 100ns ticks since UUID epoch.
   Compensate for the fact that real clock resolution is
   less than 100ns. */
void get_current_time(uuid_time_t *timestamp)
{
    static int inited = 0;
    static uuid_time_t time_last;
    static unsigned16 uuids_this_tick;
    uuid_time_t time_now;

    if (!inited) {
        get_system_time(&time_now);
        uuids_this_tick = UUIDS_PER_TICK;
        inited = 1;
    }

    for ( ; ; ) {
        get_system_time(&time_now);

        /* if clock reading changed since last UUID generated, */
        if (time_last != time_now) {
            /* reset count of uuids gen'd with this clock reading */
            uuids_this_tick = 0;
            time_last = time_now;
            break;
        }
        if (uuids_this_tick < UUIDS_PER_TICK) {
            uuids_this_tick++;
            break;
        }

        /* going too fast for our clock; spin */
    }
    /* add the count of uuids to low order bits of the clock reading */
    *timestamp = time_now + uuids_this_tick;
}

/* true_random -- generate a crypto-quality random number.
   **This sample doesn't do that.** */
static unsigned16 true_random(void)
{
    static int inited = 0;
    uuid_time_t time_now;

    if (!inited) {
        get_system_time(&time_now);
        time_now = time_now / UUIDS_PER_TICK;
        srand((unsigned int)
               (((time_now >> 32) ^ time_now) & 0xffffffff));
        inited = 1;
    }

    return rand();
}

/* uuid_create_md5_from_name -- create a version 3 (MD5) UUID using a
   "name" from a "name space" */
void uuid_create_md5_from_name(uuid_t *uuid, uuid_t nsid, void *name,
                               int namelen)
{
    MD5_CTX c;
    unsigned char hash[16];
    uuid_t net_nsid;

    /* put name space ID in network byte order so it hashes the same
       no matter what endian machine we're on */
    net_nsid = nsid;
    net_nsid.time_low = htonl(net_nsid.time_low);
    net_nsid.time_mid = htons(net_nsid.time_mid);
    net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version);

    MD5Init(&c);
    MD5Update(&c, &net_nsid, sizeof net_nsid);
    MD5Update(&c, name, namelen);
    MD5Final(hash, &c);

    /* the hash is in network byte order at this point */
    format_uuid_v3or5(uuid, hash, 3);
}

void uuid_create_sha1_from_name(uuid_t *uuid, uuid_t nsid, void *name,
                                int namelen)
{
    SHA_CTX c;
    unsigned char hash[20];
    uuid_t net_nsid;

    /* put name space ID in network byte order so it hashes the same
       no matter what endian machine we're on */
    net_nsid = nsid;
    net_nsid.time_low = htonl(net_nsid.time_low);
    net_nsid.time_mid = htons(net_nsid.time_mid);
    net_nsid.time_hi_and_version = htons(net_nsid.time_hi_and_version);

    SHA1_Init(&c);
    SHA1_Update(&c, &net_nsid, sizeof net_nsid);
    SHA1_Update(&c, name, namelen);
    SHA1_Final(hash, &c);

    /* the hash is in network byte order at this point */
    format_uuid_v3or5(uuid, hash, 5);
}

/* format_uuid_v3or5 -- make a UUID from a (pseudo)random 128-bit
   number */
void format_uuid_v3or5(uuid_t *uuid, unsigned char hash[16], int v)
{
    /* convert UUID to local byte order */
    memcpy(uuid, hash, sizeof *uuid);
    uuid->time_low = ntohl(uuid->time_low);
    uuid->time_mid = ntohs(uuid->time_mid);
    uuid->time_hi_and_version = ntohs(uuid->time_hi_and_version);

    /* put in the variant and version bits */
    uuid->time_hi_and_version &= 0x0FFF;
    uuid->time_hi_and_version |= (v << 12);
    uuid->clock_seq_hi_and_reserved &= 0x3F;
    uuid->clock_seq_hi_and_reserved |= 0x80;
}

/* uuid_compare --  Compare two UUID's "lexically" and return */
#define CHECK(f1, f2) if (f1 != f2) return f1 < f2 ? -1 : 1;
int uuid_compare(uuid_t *u1, uuid_t *u2)
{
    int i;

    CHECK(u1->time_low, u2->time_low);
    CHECK(u1->time_mid, u2->time_mid);
    CHECK(u1->time_hi_and_version, u2->time_hi_and_version);
    CHECK(u1->clock_seq_hi_and_reserved, u2->clock_seq_hi_and_reserved);
    CHECK(u1->clock_seq_low, u2->clock_seq_low)
    for (i = 0; i < 6; i++) {
        if (u1->node[i] < u2->node[i])
            return -1;
        if (u1->node[i] > u2->node[i])
            return 1;
    }
    return 0;
}
#undef CHECK
]]></artwork>
        <t>sysdep.h</t>
        <artwork><![CDATA[
#include "copyrt.h"
/* remove the following define if you aren't running WIN32 */
#define WININC 0

#ifdef WININC
#include <windows.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#include <sys/sysinfo.h>
#endif

#include "global.h"
/* change to point to where MD5 .h's live; RFC 1321 has sample
   implementation */
#include "md5.h"

/* set the following to the number of 100ns ticks of the actual
   resolution of your system's clock */
#define UUIDS_PER_TICK 1024

/* Set the following to a calls to get and release a global lock */
#define LOCK
#define UNLOCK

typedef unsigned long   unsigned32;
typedef unsigned short  unsigned16;
typedef unsigned char   unsigned8;
typedef unsigned char   byte;

/* Set this to what your compiler uses for 64-bit data type */
#ifdef WININC
#define unsigned64_t unsigned __int64
#define I64(C) C
#else
#define unsigned64_t unsigned long long
#define I64(C) C##LL
#endif

typedef unsigned64_t uuid_time_t;
typedef struct {
    char nodeID[6];
} uuid_node_t;

void get_ieee_node_identifier(uuid_node_t *node);
void get_system_time(uuid_time_t *uuid_time);
void get_random_info(char seed[16]);
]]></artwork>
        <t>sysdep.c</t>
        <artwork><![CDATA[
#include "copyrt.h"
#include <stdio.h>
#include "sysdep.h"

/* system dependent call to get IEEE node ID.
   This sample implementation generates a random node ID. */
void get_ieee_node_identifier(uuid_node_t *node)
{
    static inited = 0;
    static uuid_node_t saved_node;
    char seed[16];
    FILE *fp;

    if (!inited) {
        fp = fopen("nodeid", "rb");
        if (fp) {
            fread(&saved_node, sizeof saved_node, 1, fp);
            fclose(fp);
        }
        else {
            get_random_info(seed);
            seed[0] |= 0x01;
            memcpy(&saved_node, seed, sizeof saved_node);
            fp = fopen("nodeid", "wb");
            if (fp) {
                fwrite(&saved_node, sizeof saved_node, 1, fp);
                fclose(fp);
            }
        }
        inited = 1;
    }

    *node = saved_node;
}

/* system dependent call to get the current system time. Returned as
   100ns ticks since UUID epoch, but resolution may be less than
   100ns. */
#ifdef _WINDOWS_

void get_system_time(uuid_time_t *uuid_time)
{
    ULARGE_INTEGER time;

    /* NT keeps time in FILETIME format which is 100ns ticks since
       Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582.
       The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec)
       + 18 years and 5 leap days. */
    GetSystemTimeAsFileTime((FILETIME *)&time);
    time.QuadPart +=

          (unsigned __int64) (1000*1000*10)       // seconds
        * (unsigned __int64) (60 * 60 * 24)       // days
        * (unsigned __int64) (17+30+31+365*18+5); // # of days
    *uuid_time = time.QuadPart;
}

/* Sample code, not for use in production; see RFC 4086 */
void get_random_info(char seed[16])
{
    MD5_CTX c;
    struct {
        MEMORYSTATUS m;
        SYSTEM_INFO s;
        FILETIME t;
        LARGE_INTEGER pc;
        DWORD tc;
        DWORD l;
        char hostname[MAX_COMPUTERNAME_LENGTH + 1];
    } r;

    MD5Init(&c);
    GlobalMemoryStatus(&r.m);
    GetSystemInfo(&r.s);
    GetSystemTimeAsFileTime(&r.t);
    QueryPerformanceCounter(&r.pc);
    r.tc = GetTickCount();
    r.l = MAX_COMPUTERNAME_LENGTH + 1;
    GetComputerName(r.hostname, &r.l);
    MD5Update(&c, &r, sizeof r);
    MD5Final(seed, &c);
}

#else

void get_system_time(uuid_time_t *uuid_time)
{
    struct timeval tp;

    gettimeofday(&tp, (struct timezone *)0);

    /* Offset between UUID formatted times and Unix formatted times.
       UUID UTC base time is October 15, 1582.
       Unix base time is January 1, 1970.*/
    *uuid_time = ((unsigned64)tp.tv_sec * 10000000)
        + ((unsigned64)tp.tv_usec * 10)
        + I64(0x01B21DD213814000);
}

/* Sample code, not for use in production; see RFC 4086 */
void get_random_info(char seed[16])
{
    MD5_CTX c;
    struct {
        struct sysinfo s;
        struct timeval t;
        char hostname[257];
    } r;

    MD5Init(&c);
    sysinfo(&r.s);
    gettimeofday(&r.t, (struct timezone *)0);
    gethostname(r.hostname, 256);
    MD5Update(&c, &r, sizeof r);
    MD5Final(seed, &c);
}

#endif
]]></artwork>
        <t>utest.c</t>
        <artwork><![CDATA[
#include "copyrt.h"
#include "sysdep.h"
#include <stdio.h>
#include "uuid.h"

uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
    0x6ba7b810,
    0x9dad,
    0x11d1,
    0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
};

/* puid -- print a UUID */
void puid(uuid_t u)
{
    int i;

    printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low, u.time_mid,
    u.time_hi_and_version, u.clock_seq_hi_and_reserved,
    u.clock_seq_low);
    for (i = 0; i < 6; i++)
        printf("%2.2x", u.node[i]);
    printf("\n");
}

/* Simple driver for UUID generator */
void main(int argc, char **argv)
{
    uuid_t u;
    int f;

    uuid_create(&u);
    printf("uuid_create(): "); puid(u);

    f = uuid_compare(&u, &u);
    printf("uuid_compare(u,u): %d\n", f);     /* should be 0 */
    f = uuid_compare(&u, &NameSpace_DNS);
    printf("uuid_compare(u, NameSpace_DNS): %d\n", f); /* s.b. 1 */
    f = uuid_compare(&NameSpace_DNS, &u);
    printf("uuid_compare(NameSpace_DNS, u): %d\n", f); /* s.b. -1 */
    uuid_create_md5_from_name(&u, NameSpace_DNS, "www.example.com", 15);
    printf("uuid_create_md5_from_name(): "); puid(u);
}
]]></artwork>
        <t>Sample Output of utest
~~~
     uuid_create(): 7d444840-9dc0-11d1-b245-5ffdce74fad2
     uuid_compare(u,u): 0
     uuid_compare(u, NameSpace_DNS): 1
     uuid_compare(NameSpace_DNS, u): -1
     uuid_create_md5_from_name(): 5df41881-3aed-3515-88a7-2f4a814cf09e
~~~</t>
      </section>
      <section anchor="namespaces">
        <name>Some Name Space IDs</name>
        <t>This appendix lists the name space IDs for some potentially
   interesting name spaces, as initialized C structures and in the
   string representation defined above.</t>
        <artwork><![CDATA[
   /* Name string is a fully-qualified domain name */
   uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
       0x6ba7b810,
       0x9dad,
       0x11d1,
       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
   };

   /* Name string is a URL */
   uuid_t NameSpace_URL = { /* 6ba7b811-9dad-11d1-80b4-00c04fd430c8 */
       0x6ba7b811,
       0x9dad,
       0x11d1,
       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
   };

   /* Name string is an ISO OID */
   uuid_t NameSpace_OID = { /* 6ba7b812-9dad-11d1-80b4-00c04fd430c8 */
       0x6ba7b812,
       0x9dad,
       0x11d1,
       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
   };

   /* Name string is an X.500 DN (in DER or a text output format) */
   uuid_t NameSpace_X500 = { /* 6ba7b814-9dad-11d1-80b4-00c04fd430c8 */
       0x6ba7b814,
       0x9dad,
       0x11d1,
       0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
   };
]]></artwork>
      </section>
      <section anchor="creating_a_uuidv6_value">
        <name>Creating a UUIDv6 Value</name>
        <t>This section details a function in C which converts from a UUID version 1
to version 6:</t>
        <figure>
          <name>UUIDv6 Function in C</name>
          <artwork><![CDATA[
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <arpa/inet.h>
#include <uuid/uuid.h>

/* Converts UUID version 1 to version 6 in place. */
void uuidv1tov6(uuid_t u) {

  uint64_t ut;
  unsigned char *up = (unsigned char *)u;

  // load ut with the first 64 bits of the UUID
  ut = ((uint64_t)ntohl(*((uint32_t*)up))) << 32;
  ut |= ((uint64_t)ntohl(*((uint32_t*)&up[4])));

  // dance the bit-shift...
  ut =
    ((ut >> 32) & 0x0FFF) | // 12 least significant bits
    (0x6000) | // version number
    ((ut >> 28) & 0x0000000FFFFF0000) | // next 20 bits
    ((ut << 20) & 0x000FFFF000000000) | // next 16 bits
    (ut << 52); // 12 most significant bits

  // store back in UUID
  *((uint32_t*)up) = htonl((uint32_t)(ut >> 32));
  *((uint32_t*)&up[4]) = htonl((uint32_t)(ut));

}
]]></artwork>
        </figure>
      </section>
      <section anchor="creating_a_uuidv7_value">
        <name>Creating a UUIDv7 Value</name>
        <figure>
          <name>UUIDv7 Function in C</name>
          <artwork><![CDATA[
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <time.h>

// ...

// csprng data source
FILE *rndf;
rndf = fopen("/dev/urandom", "r");
if (rndf == 0) {
    printf("fopen /dev/urandom error\n");
    return 1;
}

// ...

// generate one UUIDv7E
uint8_t u[16];
struct timespec ts;
int ret;

ret = clock_gettime(CLOCK_REALTIME, &ts);
if (ret != 0) {
    printf("clock_gettime error: %d\n", ret);
    return 1;
}

uint64_t tms;

tms = ((uint64_t)ts.tv_sec) * 1000;
tms += ((uint64_t)ts.tv_nsec) / 1000000;

memset(u, 0, 16);

fread(&u[6], 10, 1, rndf); // fill everything after the timestamp with random bytes

*((uint64_t*)(u)) |= htonll(tms << 16); // shift time into first 48 bits and OR into place

u[8] = 0x80 | (u[8] & 0x3F); // set variant field, top two bits are 1, 0
u[6] = 0x70 | (u[6] & 0x0F); // set version field, top four bits are 0, 1, 1, 1
]]></artwork>
        </figure>
      </section>
      <section anchor="creating_a_uuidv8_value">
        <name>Creating a UUIDv8 Value</name>
        <t>UUIDv8 will vary greatly from implementation to implementation.</t>
        <t>The following example utilizes:</t>
        <ul spacing="normal">
          <li>32 bit custom-epoch timestamp (seconds elapsed since 2020-01-01 00:00:00
UTC)</li>
          <li>16 bit exotic resolution (~15 microsecond) subsecond timestamp encoded using
the fractional representation</li>
          <li>58 bit random number</li>
          <li>8 bit application-specific unique node ID</li>
          <li>8 bit rolling sequence number</li>
        </ul>
        <figure>
          <name>UUIDv8 Function in C</name>
          <artwork><![CDATA[
#include <stdint.h>
#include <time.h>

int get_random_bytes(uint8_t *buffer, int count) {
  // ...
}

int generate_uuidv8(uint8_t *uuid, uint8_t node_id) {
  struct timespec tp;
  if (clock_gettime(CLOCK_REALTIME, &tp) != 0)
    return -1; // real-time clock error

  // 32 bit biased timestamp (seconds elapsed since 2020-01-01 00:00:00 UTC)
  uint32_t timestamp_sec = tp.tv_sec - 1577836800;
  uuid[0] = timestamp_sec >> 24;
  uuid[1] = timestamp_sec >> 16;
  uuid[2] = timestamp_sec >> 8;
  uuid[3] = timestamp_sec;

  // 16 bit subsecond fraction (~15 microsecond resolution)
  uint16_t timestamp_subsec = ((uint64_t)tp.tv_nsec << 16) / 1000000000;
  uuid[4] = timestamp_subsec >> 8;
  uuid[5] = timestamp_subsec;

  // 58 bit random number and required ver and var fields
  if (get_random_bytes(&uuid[6], 8) != 0)
    return -1; // random number generator error
  uuid[6] = 0x80 | (uuid[6] & 0x0f);
  uuid[8] = 0x80 | (uuid[8] & 0x3f);

  // 8 bit application-specific node ID to guarantee application-wide uniqueness
  uuid[14] = node_id;

  // 8 bit rolling sequence number to help ensure process-wide uniqueness
  static uint8_t sequence = 0;
  uuid[15] = sequence++; // NOTE: unprotected from race conditions

  return 0;
}
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="test_vectors">
      <name>Test Vectors</name>
      <t>Both UUIDv1 and UUIDv6 test vectors utilize the same 60 bit timestamp: 0x1EC9414C232AB00
(138648505420000000) Tuesday, February 22, 2022 2:22:22.000000 PM GMT-05:00</t>
      <t>Both UUIDv1 and UUIDv6 utilize the same values in clk_seq_hi_res, clock_seq_low,
and node. All of which have been generated with random data.</t>
      <figure>
        <name>Test Vector Timestamp Pseudo-code</name>
        <artwork><![CDATA[
# Unix Nanosecond precision to Gregorian 100-nanosecond intervals
gregorian_100_ns = (Unix_64_bit_nanoseconds / 100) + gregorian_Unix_offset

# Gregorian to Unix Offset:
# The number of 100-ns intervals between the
# UUID epoch 1582-10-15 00:00:00 and the Unix epoch 1970-01-01 00:00:00.
# gregorian_Unix_offset = 0x01b21dd213814000 or 122192928000000000

# Unix 64 bit Nanosecond Timestamp:
# Unix NS: Tuesday, February 22, 2022 2:22:22 PM GMT-05:00
# Unix_64_bit_nanoseconds = 0x16D6320C3D4DCC00 or 1645557742000000000

# Work:
# gregorian_100_ns = (1645557742000000000 / 100) + 122192928000000000
# (138648505420000000 - 122192928000000000) * 100 = Unix_64_bit_nanoseconds

# Final:
# gregorian_100_ns = 0x1EC9414C232AB00 or 138648505420000000

# Original: 000111101100100101000001010011000010001100101010101100000000
# UUIDv1:   11000010001100101010101100000000|1001010000010100|0001|000111101100
# UUIDv6:   00011110110010010100000101001100|0010001100101010|0110|101100000000
]]></artwork>
      </figure>
      <section anchor="uuidv1_example">
        <name>Example of UUIDv1 Value</name>
        <figure>
          <name>UUIDv1 Example Test Vector</name>
          <artwork><![CDATA[
----------------------------------------------
field                 bits    value
----------------------------------------------
time_low              32      0xC232AB00
time_mid              16      0x9414
time_hi_and_version   16      0x11EC
clk_seq_hi_res         8      0xB3
clock_seq_low          8      0xC8
node                  48      0x9E6BDECED846
----------------------------------------------
total                128
----------------------------------------------
final_hex: C232AB00-9414-11EC-B3C8-9E6BDECED846
]]></artwork>
        </figure>
      </section>
      <section anchor="uuidv3_example">
        <name>Example of UUIDv3 Value</name>
        <t>The MD5 computation from <xref target="sample_implementation"/> is detailed in <xref target="v3md5"/>
while the field mapping and all values are illustrated in <xref target="v3fields"/>.
Finally to further illustrate the bit swaping for version and variant see <xref target="v3vervar"/>.</t>
        <figure anchor="v3md5">
          <name>UUIDv3 Example MD5</name>
          <artwork><![CDATA[
Name Space (DNS):       6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name:                   www.example.com
-----------------------------------------------
MD5:                    5df418813aed051548a72f4a814cf09e
]]></artwork>
        </figure>
        <figure anchor="v3fields">
          <name>UUIDv3 Example Test Vector</name>
          <artwork><![CDATA[
-------------------------------
field      bits    value
-------------------------------
md5_high   48      0x5df418813aed
ver         4      0x3
md5_mid    12      0x515
var         2      b10
md5_low    62      b00, 0x8a72f4a814cf09e
-------------------------------
total     128
-------------------------------
final: 5df41881-3aed-3515-88a7-2f4a814cf09e
]]></artwork>
        </figure>
        <figure anchor="v3vervar">
          <name>UUIDv3 Example Ver Var bit swaps</name>
          <artwork><![CDATA[
MD5 hex and dash:       5df41881-3aed-0515-48a7-2f4a814cf09e
Ver and Var Overwrite:  xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Final:                  5df41881-3aed-3515-88a7-2f4a814cf09e
]]></artwork>
        </figure>
      </section>
      <section anchor="uuidv4_example">
        <name>Example of UUIDv4 Value</name>
        <t>This UUIDv4 example was created by generating 16 bytes
of random data resulting in the hex value of
919108F752D133205BACF847DB4148A8. This is then used to
fill out the feilds as shown in <xref target="v4fields"/>.</t>
        <t>Finally to further illustrate the bit swapping for version and variant see <xref target="v4vervar"/>.</t>
        <figure anchor="v4fields">
          <name>UUIDv4 Example Test Vector</name>
          <artwork><![CDATA[
-------------------------------
field      bits    value
-------------------------------
random_a   48      0x919108f752d1
ver         4      0x4
random_b   12      0x320
var         2      b10
random_c   62      b01, 0xbacf847db4148a8
-------------------------------
total      128
-------------------------------
final: 919108f7-52d1-4320-9bac-f847db4148a8
]]></artwork>
        </figure>
        <figure anchor="v4vervar">
          <name>UUIDv4 Example Ver/Var bit swaps</name>
          <artwork><![CDATA[
Random hex:             919108f752d133205bacf847db4148a8
Random hex and dash:    919108f7-52d1-3320-5bac-f847db4148a8
Ver and Var Overwrite:  xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Final:                  919108f7-52d1-4320-9bac-f847db4148a8
]]></artwork>
        </figure>
      </section>
      <section anchor="uuidv5_example">
        <name>Example of UUIDv5 Value</name>
        <t>The SHA1 computation from <xref target="sample_implementation"/> is detailed in <xref target="v5sha1"/>
while the field mapping and all values are illustrated in <xref target="v5fields"/>.
Finally to further illustrate the bit swapping for version and variant and the unused/discarded part of the SHA1 value see <xref target="v5vervar"/>.</t>
        <figure anchor="v5sha1">
          <name>UUIDv5 Example SHA1</name>
          <artwork><![CDATA[
Name Space (DNS):       6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name:                   www.example.com
-----------------------------------------------
SHA1:                   2ed6657de927468b55e12665a8aea6a22dee3e35
]]></artwork>
        </figure>
        <figure anchor="v5fields">
          <name>UUIDv5 Example Test Vector</name>
          <artwork><![CDATA[
-------------------------------
field      bits    value
-------------------------------
sha_high   48      0x2ed6657de927
ver         4      0x5
sha_mid    12      0x68b
var         2      b10
sha_low    62      b01, 0x5e12665a8aea6a2
-------------------------------
total     128
-------------------------------
final: 2ed6657d-e927-568b-95e1-2665a8aea6a2
]]></artwork>
        </figure>
        <figure anchor="v5vervar">
          <name>UUIDv5 Example Ver/Var bit swaps and discarded SHA1 segment</name>
          <artwork><![CDATA[
SHA1 hex and dash:      2ed6657d-e927-468b-55e1-2665a8aea6a2-2dee3e35
Ver and Var Overwrite:  xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Final:                  2ed6657d-e927-568b-95e1-2665a8aea6a2
Discarded:                                                  -2dee3e35
]]></artwork>
        </figure>
      </section>
      <section anchor="uuidv6_example">
        <name>Example of a UUIDv6 Value</name>
        <figure>
          <name>UUIDv6 Example Test Vector</name>
          <artwork><![CDATA[
-----------------------------------------------
field                 bits    value
-----------------------------------------------
time_high              32     0x1EC9414C
time_mid               16     0x232A
time_low_and_version   16     0x6B00
clk_seq_hi_res          8     0xB3
clock_seq_low           8     0xC8
node                   48     0x9E6BDECED846
-----------------------------------------------
total                 128
-----------------------------------------------
final_hex: 1EC9414C-232A-6B00-B3C8-9E6BDECED846
]]></artwork>
        </figure>
      </section>
      <section anchor="uuidv7_example">
        <name>Example of a UUIDv7 Value</name>
        <t>This example UUIDv7 test vector utilizes a well-known 32 bit Unix epoch with
additional millisecond precision to fill the first 48 bits</t>
        <t>rand_a and rand_b are filled with random data.</t>
        <t>The timestamp is Tuesday, February 22, 2022 2:22:22.00 PM GMT-05:00 represented
as 0x17F22E279B0 or 1645557742000</t>
        <figure>
          <name>UUIDv7 Example Test Vector</name>
          <artwork><![CDATA[
-------------------------------
field      bits    value
-------------------------------
unix_ts_ms   48    0x17F22E279B0
ver           4    0x7
rand_a       12    0xCC3
var           2    b10
rand_b       62    b01, 0x8C4DC0C0C07398F
-------------------------------
total       128
-------------------------------
final: 017F22E2-79B0-7CC3-98C4-DC0C0C07398F
]]></artwork>
        </figure>
      </section>
      <section anchor="uuidv8_example">
        <name>Example of a UUIDv8 Value</name>
        <t>This example UUIDv8 test vector utilizes a well-known 64 bit Unix epoch with
nanosecond precision, truncated to the least-significant, right-most, bits
to fill the first 48 bits through version.</t>
        <t>The next two segments of custom_b and custom_c are are filled with random
data.</t>
        <t>Timestamp is Tuesday, February 22, 2022 2:22:22.000000 PM GMT-05:00 represented
as 0x16D6320C3D4DCC00 or 1645557742000000000</t>
        <t>It should be noted that this example is just to illustrate one scenario for
UUIDv8. Test vectors will likely be implementation specific and vary greatly
from this simple example.</t>
        <figure>
          <name>UUIDv8 Example Test Vector</name>
          <artwork><![CDATA[
-------------------------------
field      bits    value
-------------------------------
custom_a     48    0x320C3D4DCC00
ver           4    0x8
custom_b     12    0x75B
var           2    b10
custom_c     62    b00, 0xEC932D5F69181C0
-------------------------------
total       128
-------------------------------
final: 320C3D4D-CC00-875B-8EC9-32D5F69181C0
]]></artwork>
        </figure>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
mJ+rq7uhvW5om9X2/G0oWRGrDpX3tYd/OtXxOTfnE/UHxhrUj7imvW65PebO
Jyv2jHH8T81MzfiAw7L3BnkZNRRVc2Dua2e15FE0WU+7YJlorjZe43mgqEbH
ngL4Ak6pQpWNjytsms58qw5GuboqfYLVUN15F6J4hxvGEidkghCHwEaBQ6J3
zmFrWmuG+EGfmx/s+bDPguKQEZ7dC/mRjjlLs/Q67OFxhxTt4Nj4oRA1AX+N
NwQdhSbBn2Y2U0MzwX5PhGqFGAiUt2gffskSqcH0UI3/lh7Kb0MPz50AYrA7
sRRpDcH7FRQfwEcNnpb+cvEj/QNqIWOf0j31CsmQ5oT9ZVwzwgEOWKM8vl1E
c3Yj0UXpWUrB9HXiS0sm80SSq/35y3izkS7QP7v0j1mpn00oNsK/Tz9q/9Fv
Hxcsm/xKf/f127X9dpXwOB8dZ9j2eK4vUqEv9NutzrdXJSjwYLcSuu6yIn5M
cDmG0PT+3dnrH9WL5av6dfPd1flCy6izNPC/GXaExYZHNOsg1Gu2Xddvd8P+
9rVf8dmCW0sWLsUkYS8Z/9WHDKl9b79uvnu/cL5n3x+3uqUZ1/a7tr8D3l/j
bbcZuh5+0N3Xr5vvPuNRchO+YFezn99dtd/ajXXzPajC82iVF4Q4nq4o/7re
7+vXzffw5x/MXzPf6v52O79rv3a+3e5v3O8G/O2u0avftF83393fp9+1/e3/
rv26+e79Bv1a/rNX4j8Nz9Dt3NyEjYOdw53jnWfbjsPwJP11FykwrZ6aR1/a
MW2qFOl056rpE6mHBxOwcBO+daqL3OdwEIk4EjuyJtlihWdFb0RcUT9sQB+w
HRhHldO1FnVQ5Ra9GIdJuvKcD+u78VbrKDgIG1BBbDeJ/uBbl74d41sX157x
t+62Sv1Gh9Hijz4+DsxP81f30OFDHjp+yEPP1h660b8Wf7zFx6n5af6sAsID
GtpIo2FQBQSLL2oueKN8+t0j2X/oG9KQnVwRmUHC7mSVO2dYZvJzMNjiywNm
xxjvxO8oQhy6Ot+Bczaw2QysgiGLR3TK+oroxIEu+8DgrCHRnxluZvud5ynr
Mi6zaGbzKhne3kTZ6Atg0J2CzdouICEEvoTAAWRJxlExr0WKiIY5WyjZSgWL
AmbtuWGCEfJhbZmlRTpKZ0HFJTG1CoOMI7DYh17kI+g94TroDw3eGkHJWwN2
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

-->

</rfc>
