The Max UUID
The Max UUID is 128 one bits: ffffffff-ffff-ffff-ffff-ffffffffffff. RFC 9562 added it in 2024 as the counterpart to Nil: the largest possible value, with no version and no variant.
Max is the newest thing in the standard and the least known. It exists so that code needing an upper bound stops inventing one, and it pairs with Nil to bracket the whole 128-bit space.
ffffffff-ffff-ffff-ffff-ffffffffffffoutuuid · reserved for the future (111x) · no version · max, palindromeMax — also a palindrome
00000000-0000-0000-0000-000000000000outuuid · NCS (0xxx) — reserved, backward compatibility · no version · nil, palindromeNil, the other end of the range
On this page (8)
What it is#
All 128 bits set. Like Nil, it satisfies neither the version nor the variant rules, so no generator will ever produce it and no strict validator will accept it without an explicit exception. Unlike Nil, it is new: RFC 4122 had no such value, so older libraries and older articles do not mention it.
RFC 9562 § 5.10 · Max UUIDThe Max UUID, added by the current standard
Every spelling of it#
| Spelling | Max | Where it is expected |
|---|---|---|
| plain | ffffffff-ffff-ffff-ffff-ffffffffffff | The canonical form. What RFC 9562 writes and what every parser accepts. |
| hex | ffffffffffffffffffffffffffffffff | .NET format N. What a CHAR(32) column and most cache keys hold. |
| braces | {ffffffff-ffff-ffff-ffff-ffffffffffff} | .NET format B. The Windows registry and COM write this. |
| urn | urn:uuid:ffffffff-ffff-ffff-ffff-ffffffffffff | A valid URN, for XML, RDF and anything that needs a URI. |
| upper case | FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF | Case is not significant; Windows tools write capitals. |
The obvious use: bounding a range#
With time-ordered identifiers, a range scan over a UUID key replaces a scan over a timestamp column. Nil is the lower bound and Max the upper, so "everything in this partition" needs no special case and no synthetic sentinel of your own invention.
-- everything, expressed as a range over the key itself
SELECT * FROM events
WHERE id BETWEEN '00000000-0000-0000-0000-000000000000'
AND 'ffffffff-ffff-ffff-ffff-ffffffffffff';
-- one millisecond of a v7 stream: pad the tail with zeros and with fThe second idea is the useful one in practice: to select every v7 made during one millisecond, build the lower bound from that millisecond followed by zeros and the upper bound from the same millisecond followed by ones. The Max UUID is that trick taken to its limit.
RFC 9562 § 6.11 · SortingSorting, which is what makes a range over identifiers meaningful
What it is not#
Max is not "invalid" and not an error marker. Using it to mean failure creates the same problem as any in-band signal: the day a real value legitimately equals your sentinel, the meaning collapses. Here that day never comes, since nothing generates Max, but the habit spreads to fields where it does.
Support in the wild#
Libraries that predate RFC 9562 may not export a Max constant, and some validators reject it outright. Writing the literal by hand is safe: it is sixteen ff bytes and cannot drift. Check that your storage layer round-trips it before relying on it as a bound.
Questions people actually ask#
What is ffffffff-ffff-ffff-ffff-ffffffffffff?
The Max UUID, defined in RFC 9562 section 5.10: all 128 bits set, the largest possible UUID value.
What is the Max UUID used for?
As an upper bound. With Nil as the lower bound it brackets the whole space, which makes range scans over time-ordered identifiers straightforward.
Why do some tools say the Max UUID is invalid?
It has no version and no RFC variant, and it was only added in 2024. Older libraries and strict validators reject it unless it is allowed by name.
Related#
Browse the reference
Start here
Making and converting in bulk
Converting a UUID
Reading one
The versions, in order
In a database
ULID and the alternatives
Running the tool