Forget UUIDs and GUIDs

The Problem with Traditional UUIDs
When building applications that need unique identifiers, developers have traditionally reached for UUIDs (Universally Unique Identifiers) or GUIDs (Globally Unique Identifiers). However, these come with significant drawbacks:
- Collision risk: While theoretically unique, UUIDs can collide in large-scale applications
- Performance issues: UUIDs are computationally expensive to generate
- Size: At 36 characters, they're unnecessarily long for most use cases
- Sorting problems: UUIDs don't sort chronologically, making database indexing inefficient
Enter Cuid2: The Modern Solution
@paralleldrive/cuid2 is a modern, secure, and performant unique ID generator that solves these problems. With over 4.7 million weekly downloads on npm, it's quickly becoming the preferred choice for developers worldwide.
Key Features of Cuid2
1. Cryptographically Secure
Cuid2 uses cryptographically secure random number generation, making it virtually impossible to predict or guess IDs.
2. Collision Resistant
The probability of collision is astronomically low, even in the largest applications. Cuid2 is designed to handle billions of IDs without conflicts.
3. Performance Optimized
- Fast generation: Up to 10x faster than UUID generation
- Small size: 24 characters vs 36 for UUIDs
- Efficient: Minimal memory footprint and CPU usage
4. URL Safe
All generated IDs are URL-safe, containing only alphanumeric characters and hyphens.
5. Sortable
Cuid2 IDs are time-ordered, making them perfect for database indexing and chronological sorting.
Installation and Basic Usage
npm install @paralleldrive/cuid2
Simple Usage
import { createId } from "@paralleldrive/cuid2";
// Generate a unique ID
const id = createId();
console.log(id); // Output: "clh3aq2s8000001l08ysi5wmk"
Advanced Configuration
import { createId, init } from "@paralleldrive/cuid2";
// Initialize with custom configuration
init({
length: 32, // Custom length
fingerprint: "my-app-fingerprint", // Add application fingerprint
});
const customId = createId();
Real-World Examples
Database Records
// Creating a new user record
const newRow = {
id: createId(),
email: "user@example.com",
name: "John Doe",
createdAt: new Date(),
};
API Responses
// Express.js route handler
app.post("/api/users", (req, res) => {
const user = {
id: createId(),
...req.body,
createdAt: new Date(),
};
res.json({
success: true,
data: user,
});
});
React Components
// React component with unique keys
const TodoList = ({ todos }) => {
return (
<ul>
{todos.map((todo) => (
<li key={createId()}>{todo.text}</li>
))}
</ul>
);
};
Performance Comparison
Metric | UUID | Cuid2 | Improvement |
---|---|---|---|
Generation Speed | 1x | 10x | 10x faster |
Size | 36 chars | 24 chars | 33% smaller |
Collision Risk | Low | Extremely Low | Significantly better |
Sortability | No | Yes | Chronological |
Why Choose Cuid2 Over Alternatives?
vs UUID/GUID
- Smaller size: 24 vs 36 characters
- Better performance: 10x faster generation
- Sortable: Time-ordered for efficient indexing
- URL safe: No special encoding needed
vs Nano ID
- More secure: Cryptographically secure by default
- Better collision resistance: Designed for large-scale applications
- Consistent format: Always 24 characters
vs Auto-increment IDs
- Distributed: No coordination needed between servers
- Secure: Can't be guessed or enumerated
- Scalable: Works across multiple databases
Best Practices
1. Use for Primary Keys
// Database schema
const users = pgTable("users", {
id: varchar("id", { length: 24 })
.primaryKey()
.$defaultFn(() => createId()),
email: varchar("email", { length: 255 }).notNull(),
// ... other fields
});
2. Consistent Length
// Always use the default 24-character length for consistency
const id = createId(); // 24 characters
3. Error Handling
try {
const id = createId();
// Use the ID
} catch (error) {
console.error("Failed to generate ID:", error);
// Handle gracefully
}
Migration from UUIDs
If you're currently using UUIDs, migrating to Cuid2 is straightforward:
// Before (UUID)
import { v4 as uuidv4 } from "uuid";
const id = uuidv4();
// After (Cuid2)
import { createId } from "@paralleldrive/cuid2";
const id = createId();
Security Considerations
Cuid2 is designed with security in mind:
- Unpredictable: IDs cannot be guessed or enumerated
- No information leakage: IDs don't reveal system information
- Cryptographically secure: Uses secure random number generation
Conclusion
@paralleldrive/cuid2 represents the evolution of unique ID generation. With its combination of security, performance, and developer-friendly features, it's no surprise that it's being adopted by millions of developers worldwide.
Whether you're building a small application or a large-scale distributed system, Cuid2 provides the reliability and performance you need for generating unique identifiers. The 2.5M+ weekly downloads speak to its growing popularity and the trust the developer community has placed in this solution.
Cuid2 is not good for:
- Sequential ids
- High performance tight loops, such as render loops (if you don't need cross-host unique ids or security, consider a simple counter for this use-case, or try Ulid or NanoId).
Key Takeaways:
- Cuid2 is 10x faster than UUIDs
- 33% smaller than traditional UUIDs
- Cryptographically secure and collision-resistant
- Perfect for modern web applications
- Excellent for database indexing and sorting
Start using Cuid2 today and experience the difference in your application's performance and reliability.