UUID vs NanoID: Which Unique ID Should You Use?
UUID v4, the new time-ordered UUID v7, or NanoID? A practical comparison of size, collision safety, database performance and URL-friendliness: with clear picks.
Every application eventually needs to hand out unique identifiers, for users, orders, uploaded files, database rows. The instinct is to reach for an auto-incrementing number (1, 2, 3…), but that leaks information (competitors can count your signups) and breaks the moment you need to generate IDs across many servers without a central counter. So developers turn to random or semi-random IDs. The two dominant choices are UUID and NanoID, and picking between them, and between the UUID versions, has real consequences for your URLs, your database, and your peace of mind. How to do it to decide.
What a UUID is
A UUID (Universally Unique Identifier) is a 128-bit value, conventionally written as 32 hexadecimal digits in five hyphen-separated groups:
f47ac10b-58cc-4372-a567-0e02b2c3d479
The promise in the name is the whole point: generate one anywhere, any time, on any machine, and the odds of ever producing the same value twice are so vanishingly small that you can treat them as unique without coordination. That "no coordination needed" property is why UUIDs are everywhere in distributed systems.
There are several versions of UUID. Two matter for most people today.
UUID v4: random
Version 4 is almost entirely random: 122 of its 128 bits come from a random source. It's the default choice for most applications and the one people usually mean when they say "UUID." With 122 bits of randomness, the collision probability is negligible even at astronomical scale: you'd need to generate billions of IDs per second for many years before a collision became likely.
Its one weakness is that the randomness makes it unordered. Two UUIDs generated a second apart look completely unrelated, which, as we'll see, is unkind to databases.
UUID v7: time-ordered
Version 7 is the newer, database-friendly design. It puts a Unix millisecond timestamp in the leading bits and fills the rest with randomness. The result is still unique and unguessable, but IDs generated close together sort close together. That single change fixes the biggest practical downside of v4 for anything that gets stored in a database index.
If you're choosing a UUID version today for records that live in a database, v7 is usually the better default than v4. You keep the universal-uniqueness guarantee and gain sortability for free.
What NanoID is
NanoID is a modern, minimal alternative. Instead of a fixed 128-bit hex format, it produces a short random string from a URL-safe alphabet (A–Z, a–z, 0–9, plus _ and -):
V1StGXR8_Z5jdHi6B-myT
The default is 21 characters and carries a collision safety comparable to UUID v4, for practical purposes, just as unique. Its selling points are size and readability: it's shorter than a UUID, contains no hyphens breaking it into groups, and is safe to drop straight into a URL or filename without encoding. You can also tune it, shorten the length or restrict the alphabet, when you deliberately want smaller IDs and understand the trade-off in collision resistance.
The head-to-head
| UUID v4 | UUID v7 | NanoID | |
|---|---|---|---|
| Length | 36 chars | 36 chars | 21 chars (default) |
| Ordered / sortable | No | Yes (by time) | No |
| URL-safe as-is | Mostly | Mostly | Yes |
| Reveals creation time | No | Yes (by design) | No |
| Standardised format | Yes (RFC) | Yes (RFC) | De facto |
| Best for | Broad compatibility | Database primary keys | URLs, short public IDs |
The database question nobody warns you about
Here's the practical gotcha that catches teams by surprise. Most databases store their primary key in a B-tree index, which is kept in sorted order. When you insert records with random IDs (UUID v4 or NanoID) each new row lands in a random position in that index. On a large, busy table this causes index fragmentation and extra disk work, because the database is constantly shuffling to keep the tree ordered.
Time-ordered IDs sidestep this. Because UUID v7 IDs increase over time, new rows append near the end of the index, the way an auto-increment integer would, but without a central counter and without leaking a simple sequential count. This is the single strongest argument for UUID v7 over both UUID v4 and NanoID as a database primary key at scale.
If your ID is only ever a public handle in a URL and never the clustered primary key, this concern largely evaporates, which is exactly where NanoID shines.
So which should you use?
- UUID v7, your default for database primary keys, especially on high-volume tables where index performance matters. You get uniqueness, sortability, and a standard format.
- UUID v4, when you need maximum interoperability with existing systems, libraries, or specs that expect a classic random UUID, and ordering doesn't matter.
- NanoID: when the ID appears in URLs, filenames, or share links and you want it short, clean, and URL-safe. Great for public-facing identifiers like
example.com/p/V1StGXR8_Z5j.
A common, sensible pattern is to use both: a UUID v7 as the internal primary key, and a NanoID as the short public-facing slug. Internal performance and external tidiness, each solved by the right tool.
One rule that applies to all of them
Whichever you pick, don't hand-write IDs: generate them with a proper, well-seeded random source. A weak or predictable generator undermines both uniqueness and security. You can create standards-compliant values in seconds with our UUID generator for v4 and v7, or grab a short, URL-ready string from the NanoID generator. Both run entirely in your browser, so nothing about the IDs you create is transmitted or logged.
If your IDs end up in JWTs, cookies, or API payloads, it's worth understanding how those tokens are structured too: our guide on the anatomy of a JSON Web Token covers where identifiers like sub live inside a token.
A right tool per job
There's no single winner, there's a right tool per job. Reach for UUID v7 when the ID is a database key and you care about index performance, UUID v4 when you need the classic universal format, and NanoID when the ID lives in a URL and should be short and clean. Whatever you choose, generate it properly: spin up a compliant UUID or a URL-safe NanoID in seconds with our UUID generator and NanoID generator, free and entirely in-browser.
Generate both and compare with your own eyes
The fastest way to internalise this comparison: the UUID generator and NanoID generator run side by side in your browser, using the crypto-grade randomness the browser provides. Generate a handful of each and the article's argument becomes visual: the UUID's 36 characters with hyphens versus NanoID's compact 21, both unguessable. For database keys where insert order matters, generate v7 UUIDs and note how the leading characters climb with time. That prefix is the index-friendliness.
Sources
- RFC 9562 (Universally Unique IDentifiers (UUIDs)), the spec that introduced UUID v7
- Nano ID
Written by
Chandrabhan Shekhawat
Founder of Gigai Kripa Services. Builds the 250+ privacy-first browser tools on this site and writes the guides that go with them.
Never miss a guide
New tools and how-to articles land regularly. Follow along however you like. No inbox required.
Keep reading
developer-tools
How to Find Exposed API Keys in Your Code (Before Someone Else Does)
One pasted.env file or rushed commit is all it takes to leak a live API key. The steps secrets end up in code, how to scan for them in seconds, and the habits that stop it happening again.
10 mins readdeveloper-tools
No AI Inside: How Our Regex Generator Actually Works
Our regex generator turns example strings into a working pattern with zero AI, and that's a feature, not a shortcut. A look under the hood, and an honest case for boring algorithms.
5 mins readdeveloper-tools
How to Generate TypeScript Types from JSON (API Responses Made Type-Safe)
Turn any API JSON response into accurate TypeScript interfaces. How inference works, handling nulls and arrays, and a fast in-browser JSON-to-TypeScript converter.
6 mins read
Explore related tools
Problems we solve
Definitions
From the blog
- How to Find Exposed API Keys in Your Code (Before Someone Else Does)
- No AI Inside: How Our Regex Generator Actually Works
- How to Generate TypeScript Types from JSON (API Responses Made Type-Safe)
- Regex Cheat Sheet: Common Patterns and How to Test Them
- Base64 Encoding Explained: What It Is and When to Use It