Mornox Tools

UUID Generator

Generate UUID v4 and v7 identifiers instantly. Bulk generate, copy, and learn about UUID formats and best practices.

A Universally Unique Identifier (UUID) is a 128-bit mathematical label used in computer systems to uniquely identify information without requiring a central coordinating authority. By leveraging an astronomically large mathematical space of 340 undecillion possible values, UUIDs allow distributed systems, databases, and applications to independently generate unique identifiers with a virtually zero probability of duplication. This definitive guide explores the architecture, mathematics, historical evolution, and practical implementation of UUIDs, providing software engineers and system architects with the exact knowledge required to master distributed identification.

What It Is and Why It Matters

In the realm of computer science and database management, uniquely identifying a piece of data is a foundational requirement. Historically, systems relied on simple auto-incrementing integers (e.g., 1, 2, 3) generated by a single, central relational database. While this approach works perfectly for isolated applications, it completely breaks down in distributed systems, microservices architectures, and offline-first mobile applications. If two separate databases independently generate an ID of "502", merging those databases will result in a catastrophic primary key collision. A Universally Unique Identifier (UUID) solves this exact problem by decentralizing the creation of identifiers.

A UUID is a 128-bit number, typically represented as a string of 32 hexadecimal digits separated by hyphens into five groups (e.g., 123e4567-e89b-12d3-a456-426614174000). Because the total number of possible UUIDs is $2^{128}$ (approximately $3.4 \times 10^{38}$, or 340 undecillion), any computer anywhere in the world can generate a UUID at any time without checking a central registry, confident that no other computer will ever generate the exact same identifier. This mathematical guarantee of uniqueness eliminates the need for network coordination, drastically reducing latency and removing single points of failure in complex software ecosystems.

The importance of UUIDs extends far beyond simple database keys. They are the invisible backbone of modern computing infrastructure. When a user uploads a file to a cloud storage bucket, a UUID prevents it from overwriting another file with the same name. When a microservice architecture processes an asynchronous e-commerce order, a UUID tracks that specific transaction across dozens of independent servers, logging systems, and payment gateways. Without the decentralized, collision-resistant nature of UUIDs, modern distributed computing, cloud architecture, and global-scale web applications simply could not function reliably.

History and Origin

The concept of the Universally Unique Identifier was born out of the necessity to manage sprawling, decentralized computer networks in the late 1980s. The original implementation was created in 1989 by Apollo Computer for their Network Computing System (NCS). Apollo engineers, including Paul Leach, recognized that remote procedure calls (RPCs) across distinct physical machines required a standard way to identify interfaces and objects without a central naming registry. Their original design combined a 48-bit MAC address (identifying the physical hardware) with a 60-bit timestamp, creating an identifier that was intrinsically tied to a specific machine at a specific microsecond in time.

In 1990, Hewlett-Packard acquired Apollo Computer and brought the NCS technology to the Open Software Foundation (OSF). The OSF integrated this identifier system into their Distributed Computing Environment (DCE), officially standardizing the term "UUID". During this era, Microsoft also adopted the DCE standard for their Component Object Model (COM) and Distributed COM (DCOM) architectures, though they chose to rebrand the concept as a Globally Unique Identifier (GUID). To this day, UUID and GUID refer to the exact same technical standard, with GUID simply serving as Microsoft's proprietary nomenclature.

The formal standardization of UUIDs for the broader internet occurred in July 2005 with the publication of Request for Comments (RFC) 4122 by the Internet Engineering Task Force (IETF). Authored by Paul Leach, Michael Mealling, and Rich Salz, RFC 4122 defined the exact algorithms for generating UUID versions 1 through 5, cementing the 128-bit structure and the 8-4-4-4-12 hexadecimal string format. For nearly two decades, RFC 4122 remained the undisputed standard. However, as modern high-performance databases struggled with the random nature of Version 4 UUIDs, the IETF published RFC 9562 in May 2024. Authored by Brad Peabody and Kyzer Davis, this seminal update introduced Versions 6, 7, and 8, specifically optimizing UUIDs for lexicographical sorting and modern database indexing.

Key Concepts and Terminology

To fully grasp the mechanics of UUIDs, one must understand the specific vocabulary and technical concepts that govern their creation and structure. A Bit is the most basic unit of information in computing, representing either a 0 or a 1. A UUID consists of exactly 128 bits. Because reading 128 ones and zeros is impossible for humans, these bits are translated into Hexadecimal (base-16) notation. Hexadecimal uses the numbers 0-9 and the letters a-f to represent values from 0 to 15. Every hexadecimal character represents exactly 4 bits (a nibble), meaning a 128-bit UUID requires exactly 32 hexadecimal characters to display.

Entropy is a measure of randomness or unpredictability in a system. In the context of UUIDs, high entropy means an attacker cannot predict the next generated ID, and the chance of accidental duplication is minimized. To achieve this, systems use a Cryptographically Secure Pseudorandom Number Generator (CSPRNG). Unlike basic random number functions (which follow predictable mathematical patterns), a CSPRNG gathers entropy from hardware events—such as CPU temperature fluctuations, keystroke timings, or network packet arrival times—to generate numbers that are statistically indistinguishable from true randomness.

The concepts of Lexicographical Sorting and Monotonicity are critical when evaluating UUIDs for database use. Lexicographical sorting means that values are ordered exactly like words in a dictionary, comparing them character by character from left to right. Monotonicity means a sequence of values strictly increases over time; the next value generated will always be larger than the previous one. Traditional random UUIDs lack monotonicity, meaning they sort randomly. Newer standards, like UUID Version 7, embed a Unix Epoch Timestamp (the number of milliseconds elapsed since January 1, 1970) at the very beginning of the string, ensuring that newly generated UUIDs sort lexicographically and monotonically, which drastically improves database performance.

Types, Variations, and Methods: The UUID Versions

The UUID standard does not dictate a single method for generating identifiers; rather, it defines a rigid 128-bit structure that can be populated using several distinct algorithms, known as "Versions". Version 1 (Time and Node Based) generates the ID by combining the computer's 48-bit physical MAC address with a 60-bit timestamp representing the number of 100-nanosecond intervals since October 15, 1582 (the adoption of the Gregorian calendar). While this guarantees absolute uniqueness (as no two network cards share a MAC address), it poses massive privacy risks, as the generated UUID inherently reveals the physical hardware and exact time of creation.

Version 3 (MD5 Hash) and Version 5 (SHA-1 Hash) are deterministic, namespace-based UUIDs. Instead of generating a random number, these versions take an existing namespace (like a URL or a domain name) and a specific name, combine them, and run them through a cryptographic hashing algorithm (MD5 for v3, SHA-1 for v5). The resulting hash is truncated to fit the 128-bit UUID structure. Because they are deterministic, generating a Version 5 UUID using the namespace DNS and the name example.com will produce the exact same UUID every single time, on any machine in the world. This is highly useful for mapping existing unique data (like email addresses) into a UUID format without requiring a database lookup.

Version 4 (Random) is historically the most widely used UUID variant. It discards hardware addresses and timestamps entirely, relying purely on the system's random number generator. Out of the 128 bits, 6 bits are reserved for formatting, leaving 122 bits of pure random entropy. This makes Version 4 incredibly simple to generate and completely anonymous. However, its complete randomness makes it highly inefficient for database indexing.

To solve the database performance issues of Version 4, the IETF introduced Version 7 (Unix Epoch Time-Ordered) in 2024 via RFC 9562. Version 7 dedicates the first 48 bits to a standard Unix timestamp in milliseconds, followed by 74 bits of pure randomness. This brilliant compromise means that Version 7 UUIDs are completely anonymous and collision-resistant, yet they naturally sort in chronological order. When inserted into a database, Version 7 UUIDs append to the end of the index just like an auto-incrementing integer, entirely eliminating the catastrophic performance penalties associated with random Version 4 UUIDs.

How It Works — Step by Step: The Anatomy of a UUID

Despite the different generation methods, every valid UUID must conform to a strict structural layout. A UUID is formatted as a 36-character string containing 32 hexadecimal digits and 4 hyphens. The layout follows an 8-4-4-4-12 grouping. Let us examine a concrete example of a Version 4 UUID: f47ac10b-58cc-4372-a567-0e02b2c3d479. To the untrained eye, this is simply a string of random characters. However, specific characters within this string act as structural metadata, communicating exactly how the UUID was generated to any system that reads it.

The 128 bits of a UUID are divided into specific fields. The first group of 8 characters (f47ac10b) represents the time_low field (32 bits). The second group of 4 characters (58cc) represents the time_mid field (16 bits). The third group of 4 characters (4372) represents the time_hi_and_version field (16 bits). The fourth group (a567) represents the clock_seq_hi_and_reserved and clock_seq_low fields (16 bits). Finally, the last group of 12 characters (0e02b2c3d479) represents the node field (48 bits). This terminology is a historical artifact from Version 1, but the bit layout remains strictly enforced across all versions.

The most critical structural elements are the Version and Variant markers. Look at the first character of the third group: 4372. The 4 is the Version marker. It explicitly tells the system that this is a Version 4 (Random) UUID. If this were a time-ordered Version 7 UUID, that character would always be a 7. Next, look at the first character of the fourth group: a567. The a is the Variant marker. According to the IETF RFC standard, the variant bits must be 10xx in binary. In hexadecimal, this means the variant character can only ever be 8, 9, a, or b. Therefore, in any valid Version 4 UUID, the 13th character will always be 4, and the 17th character will always be 8, 9, a, or b. The remaining 122 bits are filled with randomly generated data.

The Mathematics of Uniqueness: Calculating Collision Probabilities

The primary anxiety developers face when adopting Version 4 UUIDs is the fear of a "collision"—two systems independently generating the exact same 128-bit number. Because Version 4 UUIDs reserve 6 bits for the version and variant markers, they contain exactly 122 bits of random entropy. This means there are $2^{122}$ possible combinations, which equates to exactly $5,316,911,983,139,663,936,027,584,360,328,036,448$ possible unique identifiers. While this number is unfathomably large, the probability of a collision is governed by the Birthday Paradox, a mathematical principle stating that the chance of a collision grows exponentially as the number of generated items increases.

To calculate the exact probability of a collision, we use the approximation formula for the Birthday Problem: $P(n) \approx 1 - e^{-\frac{n^2}{2H}}$, where $P(n)$ is the probability of a collision, $n$ is the total number of UUIDs generated, $H$ is the total number of possible UUIDs ($2^{122}$), and $e$ is Euler's number (approximately 2.71828). Let us perform a full worked example using an extreme, realistic scenario. Imagine a massive global tech company generating 1 billion UUIDs per second, continuously, for 100 years.

First, calculate $n$, the total number of UUIDs generated: 1,000,000,000 UUIDs/sec $\times$ 60 seconds $\times$ 60 minutes $\times$ 24 hours $\times$ 365.25 days $\times$ 100 years. This equals approximately $3.15576 \times 10^{18}$ total UUIDs. Next, square this number ($n^2$): $(3.15576 \times 10^{18})^2 = 9.958 \times 10^{36}$. Now, calculate the denominator $2H$: $2 \times (5.316 \times 10^{36}) = 1.0632 \times 10^{37}$. Divide $n^2$ by $2H$: $9.958 \times 10^{36} / 1.0632 \times 10^{37} = 0.9366$. Finally, apply the exponent: $P = 1 - e^{-0.9366}$. Calculating $e^{-0.9366}$ gives approximately 0.3919. Subtracting from 1 gives $1 - 0.3919 = 0.6081$.

Therefore, if you generate 1 billion UUIDs every single second for an entire century, the probability of generating even a single duplicate is roughly 60.8%. For standard applications generating a few million records a month, the probability of a collision is mathematically indistinguishable from zero. You are statistically far more likely to be struck by a meteorite than to experience an accidental UUID Version 4 collision in a standard web application.

Real-World Examples and Applications

To understand the practical utility of UUIDs, consider the architecture of a modern e-commerce platform like Shopify or Amazon. When a customer clicks "Submit Order", the frontend application immediately generates a UUID (e.g., 71a8b2c4-9f3d-4e2a-b819-0c3d4e5f6a7b) to represent that specific transaction. This ID is passed to the inventory microservice to reserve the items, the payment gateway to process the credit card, and the shipping service to generate a label. Because the ID was generated instantly on the client side, all three microservices can process their tasks asynchronously and log their results using the exact same identifier. If the system relied on a central database to generate an ID, all services would have to wait in a synchronous queue, creating massive latency bottlenecks.

Another ubiquitous application of UUIDs is in offline-first mobile applications. Imagine a field inspector using a tablet application to record bridge safety data in a remote area without cellular service. Over the course of three days, the inspector creates 450 new inspection records. Because the application uses UUIDs for the primary keys of these records, they are guaranteed to be globally unique. When the inspector finally returns to an area with Wi-Fi and synchronizes the tablet with the central corporate database, the 450 records merge flawlessly. If the local tablet had used auto-incrementing integers (1 through 450), those IDs would violently collide with the thousands of other records submitted by different inspectors across the country.

UUIDs are also the standard for generating secure, non-guessable session identifiers in web authentication. When a 35-year-old user logs into their banking portal, the server verifies their password and generates a Version 4 UUID to serve as their active session token. This token is stored in the user's browser cookies. Because a Version 4 UUID contains 122 bits of cryptographic entropy, it is immune to "Insecure Direct Object Reference" (IDOR) attacks. A malicious hacker cannot simply guess the next active session ID by incrementing a number (e.g., changing session 1005 to 1006). The sheer mathematical vastness of the UUID space provides an inherent layer of security through absolute unpredictability.

Common Mistakes and Misconceptions

The most prevalent misconception among novice developers is that UUIDs are inherently secure and can be used as cryptographic secrets or passwords. This is categorically false, particularly for Version 1 UUIDs. Because a Version 1 UUID exposes the exact MAC address of the host machine and the exact microsecond it was generated, an attacker can easily reverse-engineer the identifier to identify the physical server and predict sequentially generated IDs. Even Version 4 UUIDs, while random, are only as secure as the underlying random number generator. If a developer uses a weak, non-cryptographic PRNG (like standard Math.random() in older JavaScript environments), the resulting UUIDs can be predicted by analyzing the PRNG's internal state.

Another catastrophic mistake is using random Version 4 UUIDs as primary keys in relational databases with clustered indexes, such as MySQL's InnoDB engine. In a clustered index, data rows are stored physically on the disk in the exact order of their primary key. When you insert sequentially ordered auto-incrementing integers (1, 2, 3), the database simply appends the new data to the end of the disk file. However, because Version 4 UUIDs are completely random, inserting them forces the database to constantly rewrite and reorganize the physical disk blocks to maintain the sorted index. This phenomenon, known as "page splitting" and "write amplification", can degrade database insert performance by up to 80% once the table exceeds a few million rows.

Finally, developers frequently make the mistake of storing UUIDs as standard text strings (e.g., VARCHAR(36) in SQL databases). While a UUID is commonly displayed as a 36-character string, the underlying data is only 16 bytes long. Storing it as a 36-byte string wastes 20 bytes of disk space and RAM per row. In a database with 100 million rows, storing UUIDs as strings wastes exactly 2 gigabytes of expensive memory in the index alone. This bloat directly translates to slower query performance, higher infrastructure costs, and reduced cache efficiency.

Best Practices and Expert Strategies

The definitive best practice for modern database architecture is to completely abandon Version 4 UUIDs for database primary keys and adopt the new Version 7 standard. By placing a 48-bit Unix timestamp at the beginning of the identifier, Version 7 UUIDs guarantee chronological, lexicographical sorting. This entirely eliminates the B-tree fragmentation and page-splitting penalties associated with random UUIDs. When an expert architect designs a new microservice backing a PostgreSQL or MySQL database, they immediately implement Version 7 UUIDs to ensure the system can scale to billions of rows without suffering catastrophic insert degradation.

When storing UUIDs, professionals always utilize the most efficient binary data types available. Instead of VARCHAR(36), a UUID should be stripped of its hyphens and stored as a raw 128-bit integer. In MySQL and MariaDB, the optimal data type is BINARY(16). In PostgreSQL, there is a native uuid data type that automatically handles the most efficient binary storage and indexing under the hood. By storing UUIDs as 16-byte binary blobs, developers maximize the number of index entries that can fit into a single page of RAM, drastically accelerating JOIN operations and SELECT queries across massive datasets.

When generating Version 4 UUIDs in application code, experts strictly enforce the use of Cryptographically Secure Pseudorandom Number Generators (CSPRNG). In Python, this means using the secrets module rather than the standard random module. In Node.js, it requires the crypto.randomUUID() method. In browser environments, developers must use window.crypto.randomUUID(). Relying on these native, hardware-backed cryptographic libraries ensures that the entropy pool is properly seeded by the operating system, guaranteeing the mathematical improbability of collisions and protecting the application against predictive security attacks.

Edge Cases, Limitations, and Pitfalls

While UUIDs solve the problem of decentralized identification, they introduce significant network and storage overhead, which becomes a critical limitation in highly constrained environments. A standard auto-incrementing 64-bit integer (a BIGINT in SQL) consumes exactly 8 bytes of storage. A UUID consumes 16 bytes—exactly double the size. While 8 extra bytes per row sounds trivial, the compound effect in a massive relational database is severe. If a core table has 5 foreign key constraints pointing to other UUID-based tables, a single row now requires 80 bytes of overhead just for relational mapping. In high-frequency trading platforms or massive IoT telemetry systems logging millions of events per minute, this 100% increase in index size can overwhelm physical memory and force the database to read from slow disk storage.

Another distinct pitfall occurs in URL routing and user-facing interfaces. UUIDs are notoriously hostile to human users. If a customer needs to read an order number over the phone to a support agent, reading f47ac10b-58cc-4372-a567-0e02b2c3d479 is an incredibly frustrating, error-prone experience. Furthermore, placing full 36-character UUIDs in web URLs results in massive, ugly links that are prone to being broken when copied and pasted into email clients or messaging applications. In these edge cases, exposing raw UUIDs to end users is a severe UX failure.

Finally, relying on time-based UUIDs (Version 1, 6, or 7) introduces an edge case dependency on the system clock. If the physical server generating the UUID experiences a sudden "clock rollback" (often caused by Network Time Protocol (NTP) synchronization correcting a drifting system clock), the system might generate a UUID with a timestamp that is earlier than the previously generated one. This breaks the monotonic sorting guarantee. Robust UUID generation libraries must implement specific "clock sequence" counters to detect backward time jumps and artificially increment the counter to ensure the resulting UUIDs remain strictly ordered despite hardware clock anomalies.

Industry Standards and Benchmarks

The undisputed global authority on UUIDs is the Internet Engineering Task Force (IETF). The foundational benchmark for all legacy UUID implementations is RFC 4122, published in 2005. Any library, database, or programming language claiming to support UUIDs must conform to the bit-level specifications outlined in this document. In May 2024, the IETF published RFC 9562, which officially obsoletes RFC 4122. RFC 9562 is the new industry standard, formalizing the adoption of time-ordered UUIDs (Versions 6, 7, and 8) to meet the performance demands of modern cloud-native databases.

Beyond the IETF, UUIDs are heavily standardized across international computing organizations. The International Organization for Standardization (ISO) and the International Electrotechnical Commission (IEC) formally define UUIDs in the ISO/IEC 11578:1996 standard, specifically within the context of remote procedure calls. Similarly, the International Telecommunication Union (ITU) recognizes the exact same 128-bit structure under ITU-T Recommendation X.667. This unprecedented level of cross-organizational standardization guarantees absolute interoperability. A UUID generated by an Apple iPhone running Swift will be perfectly parsed, validated, and stored by a Linux server running Java, without any translation or data loss.

In terms of performance benchmarks, modern hardware is capable of generating UUIDs at staggering speeds. A standard consumer-grade CPU (such as an AMD Ryzen 7 or Intel Core i7) executing highly optimized C or Rust code can generate between 20 million and 30 million Version 4 UUIDs per second on a single thread. When evaluating database insertion benchmarks, shifting from random Version 4 UUIDs to time-ordered Version 7 UUIDs typically yields a 50% to 150% increase in raw INSERT throughput on relational databases like MySQL and PostgreSQL, while simultaneously reducing disk I/O operations by up to 70% during massive bulk-load operations.

Comparisons with Alternatives: ULID, NanoID, and Snowflake

While UUIDs are the industry standard, specific engineering challenges have birthed powerful alternatives. The most prominent alternative is the Universally Unique Lexicographically Sortable Identifier (ULID). Created to solve the database sorting issues of UUIDv4 before UUIDv7 existed, a ULID is also a 128-bit identifier. However, it is encoded using a custom 32-character Base32 alphabet (excluding confusing characters like 'I', 'L', 'O', and 'U'). A ULID looks like 01ARZ3NDEKTSV4RRFFQ69G5FAV. Because it relies on a 48-bit timestamp and 80 bits of randomness, it provides the exact same sorting benefits as UUIDv7 but offers a shorter, more URL-friendly string representation. However, ULID lacks the massive, formalized IETF standardization of UUID.

NanoID is a vastly superior alternative when dealing strictly with client-side, user-facing identifiers. NanoID is a tiny, secure, URL-friendly unique string generator primarily used in JavaScript ecosystems. Unlike UUID's strict 128-bit length, NanoID allows developers to customize the length and alphabet of the ID. By utilizing a larger alphabet (including uppercase, lowercase, numbers, and symbols), a 21-character NanoID can contain the exact same amount of mathematical entropy as a 36-character UUID string. NanoID is significantly faster to generate in web browsers and results in much cleaner URLs, making it the preferred choice for document sharing links or temporary web session IDs.

Snowflake IDs represent a fundamentally different approach, originally engineered by Twitter to handle millions of tweets per second. A Snowflake ID is a 64-bit integer (half the size of a UUID) composed of a timestamp, a worker machine ID, and a sequence number. Because it is only 64 bits, it fits perfectly into standard database BIGINT columns, making it twice as memory-efficient as a UUID. However, Snowflake IDs require central coordination. You must assign a unique "worker ID" to every server generating the IDs to prevent collisions. Therefore, while Snowflake IDs offer unparalleled database performance and efficiency, they completely sacrifice the decentralized, "generate anywhere" convenience that defines the UUID standard.

Frequently Asked Questions

What is the difference between a UUID and a GUID? There is absolutely no structural or mathematical difference between a UUID (Universally Unique Identifier) and a GUID (Globally Unique Identifier). The distinction is purely historical and semantic. UUID is the standard term adopted by the Open Software Foundation and the IETF, while GUID is the proprietary term adopted by Microsoft in the 1990s for their Windows ecosystem. A valid GUID is a valid UUID, and they share the exact same 128-bit structure, versioning, and formatting rules.

Can a UUID Version 4 ever generate a duplicate? Mathematically, yes; practically, no. A Version 4 UUID contains 122 bits of random entropy, equating to $5.3 \times 10^{36}$ possible combinations. While the Birthday Paradox dictates that generating enough IDs will eventually force a collision, the scale required is astronomical. You would need to generate 1 billion UUIDs per second for 85 years to reach a mere 50% chance of a single collision. For all practical software engineering purposes, Version 4 UUIDs are considered entirely unique.

Why does my database slow down when using UUIDs as primary keys? If you are using Version 4 (Random) UUIDs in a database with a clustered index (like MySQL's InnoDB), the random nature of the IDs destroys the physical organization of the data on the disk. Because the database attempts to store rows in sequential order, inserting a random ID forces the database to split data pages and rewrite large chunks of the index to insert the new row in the middle. This causes massive write amplification and disk I/O bottlenecks. Switching to time-ordered Version 7 UUIDs completely resolves this issue.

Should I store UUIDs as strings or binary data in my database? You should always store UUIDs as binary data if your database allows it. A UUID string (e.g., VARCHAR(36)) consumes 36 bytes of storage. The actual mathematical value of a UUID is only 128 bits, which equates to exactly 16 bytes. Storing it as a string wastes 20 bytes per row, bloating your database indexes and slowing down queries. Use BINARY(16) in MySQL, or the native uuid data type in PostgreSQL to ensure optimal storage and query performance.

Are UUIDs secure enough to use as API keys or passwords? No, UUIDs should never be used as cryptographic keys, passwords, or secure API tokens. While Version 4 UUIDs are highly unpredictable if generated with a Cryptographically Secure Pseudorandom Number Generator (CSPRNG), the UUID standard itself does not mandate cryptographic security. Furthermore, Version 1 UUIDs actively expose your server's MAC address and generation timestamp, making them highly vulnerable to reverse engineering. Always use dedicated cryptographic libraries generating at least 256 bits of entropy for secure access tokens.

What is the new UUID Version 7 and should I use it? UUID Version 7 is the new industry standard introduced in IETF RFC 9562 (May 2024), designed specifically to optimize database performance. It combines a 48-bit Unix epoch timestamp with 74 bits of randomness. This ensures that the generated UUIDs are both universally unique and naturally sortable in chronological order. If you are starting a new software project or migrating a database, you should absolutely use Version 7 instead of Version 4 for all primary keys to ensure maximum database scalability.

Command Palette

Search for a command to run...