Complete UUID Generator Guide: Generate Unique Identifiers
What are UUIDs and Why Use Them?
UUID (Universally Unique Identifier) is a 128-bit identifier that is guaranteed to be unique across all systems and time. UUIDs are essential for distributed systems, databases, and applications that need to generate unique identifiers without coordination between systems.
Why Our UUID Generator is Essential:
- True Uniqueness: Cryptographically secure random generation
- Multiple Versions: Support for UUID v1, v3, v4, v5, and v6
- Bulk Generation: Create thousands of UUIDs instantly
- Format Options: Standard, compressed, and custom formats
- Collision-Free: Virtually zero chance of generating duplicates
- Standards Compliant: Follows RFC 4122 specifications
Key Features Overview
🔢 UUID Versions
- Version 1: Time-based with MAC address
- Version 3: Namespace-based using MD5 hashing
- Version 4: Random/pseudo-random generation (most common)
- Version 5: Namespace-based using SHA-1 hashing
- Version 6: Reordered time-based for better sorting
📊 Generation Options
- Single UUID: Generate one unique identifier
- Bulk Generation: Create up to 10,000 UUIDs at once
- Custom Namespaces: Define namespaces for v3/v5 generation
- Format Control: Uppercase, lowercase, with/without hyphens
- Validation: Check UUID format and version
🔧 Advanced Features
- Timestamp Extraction: Decode time information from time-based UUIDs
- Namespace Management: Create and reuse custom namespaces
- Export Options: Download UUIDs as text, CSV, or JSON
- Duplicate Detection: Verify uniqueness in generated sets
- Performance Metrics: Generation speed and collision analysis
UUID Versions Explained
Version 1 (Time-based)
Uses timestamp and MAC address to ensure uniqueness.
Structure:
- Time: 60-bit timestamp (100-nanosecond intervals since 1582-10-15)
- Clock Sequence: 14-bit counter for same-timestamp generation
- Node: 48-bit MAC address or random number
Example:
6ba7b810-9dad-11d1-80b4-00c04fd430c8
│ │ │ │ │ │ └── Node (MAC address)
│ │ │ │ │ └────── Clock sequence + variant
│ │ │ │ └──────── Version (1) + clock sequence high
│ │ │ └────────── Time high + version
│ │ └──────────── Time mid
│ └────────────── Time low
Use Cases:
- Database primary keys with time ordering
- Event logging systems
- Audit trails
Advantages:
- Sortable by generation time
- Guaranteed uniqueness per MAC address
Disadvantages:
- Reveals MAC address (privacy concern)
- Requires access to MAC address
Version 3 (Namespace + MD5)
Generated using MD5 hash of namespace and name.
Example Generation:
Namespace: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name: "example.com"
MD5 Hash: a1b2c3d4e5f67890a1b2c3d4e5f67890
UUID v3: a1b2c3d4-e5f6-3890-a1b2-c3d4e5f67890
Use Cases:
- Deterministic UUIDs for same input
- URL-to-UUID mapping
- Content-based identifiers
Advantages:
- Same input always produces same UUID
- No random number generation required
Disadvantages:
- MD5 is cryptographically weak
- Potential for collisions with crafted inputs
Version 4 (Random)
Purely random/pseudo-random generation - most commonly used.
Structure:
- 122 bits: Cryptographically secure random data
- 6 bits: Fixed (version and variant indicators)
Example:
550e8400-e29b-41d4-a716-446655440000
└── All random except version (4) and variant bits
Randomness Quality:
// High-quality random source
const array = new Uint8Array(16);
crypto.getRandomValues(array);
// 2^122 possible values ≈ 5.3 × 10^36
// Collision probability: ~1 in 2.7 × 10^18 after generating 1 billion UUIDs
Use Cases:
- General purpose unique identifiers
- Database primary keys
- Session identifiers
- API keys
Advantages:
- No dependency on MAC address or timestamp
- Cryptographically secure
- No information leakage
Disadvantages:
- Not sortable by generation time
- Purely random (no embedded information)
Version 5 (Namespace + SHA-1)
Similar to v3 but uses SHA-1 instead of MD5.
Example:
Namespace: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Name: "example.com"
SHA-1 Hash: 1234567890abcdef1234567890abcdef12345678
UUID v5: 12345678-90ab-5def-1234-567890abcdef
Use Cases:
- Same as v3 but where stronger hashing is required
- Legacy system integration
- Deterministic generation with better security
Advantages:
- Stronger than MD5 (though SHA-1 is also deprecated)
- Deterministic generation
- Better collision resistance than v3
Disadvantages:
- SHA-1 is cryptographically weak for new applications
- Still vulnerable to crafted collisions
Version 6 (Reordered Time-based)
Improved version of v1 with better timestamp ordering.
Structure:
01234567-89ab-6cde-f012-345678901234
│ │ │ │ │ └── Node
│ │ │ │ └────── Clock sequence
│ │ │ └──────── Version + time_high
│ │ └────────── time_mid
│ └──────────── time_high_and_version reordered
Advantages over v1:
- Better database indexing performance
- Sortable chronologically
- Reduced index fragmentation
Getting Started
Step 1: Access the Tool
Visit our UUID Generator to start generating unique identifiers immediately.
Step 2: Choose UUID Version
For Most Use Cases (Recommended):
Version 4 (Random):
✅ No dependencies
✅ Maximum privacy
✅ Cryptographically secure
✅ Standards compliant
Example: 550e8400-e29b-41d4-a716-446655440000
For Time-ordered Needs:
Version 1 (Time-based):
✅ Chronologically sortable
✅ Embedded timestamp
⚠️ Reveals MAC address
Example: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Step 3: Generation Options
Single UUID Generation:
- Select Version: Choose UUID version from dropdown
- Click Generate: Get instant UUID
- Copy Result: Use copy button to get UUID
- Validate: Optional format validation
Bulk Generation:
- Set Quantity: Choose how many UUIDs (1-10,000)
- Select Format: Standard, uppercase, or without hyphens
- Generate Bulk: Create all UUIDs instantly
- Export: Download as text, CSV, or JSON
UUID Formats and Structure
Standard Format
The canonical UUID format with hyphens:
Format: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Example: 123e4567-e89b-12d3-a456-426614174000
Where:
- x = hexadecimal digit (0-9, a-f)
- M = version number (1, 3, 4, 5, 6)
- N = variant (8, 9, a, or b)
Alternative Formats
Without Hyphens:
Standard: 123e4567-e89b-12d3-a456-426614174000
Compact: 123e4567e89b12d3a456426614174000
Uppercase:
Lowercase: 123e4567-e89b-12d3-a456-426614174000
Uppercase: 123E4567-E89B-12D3-A456-426614174000
Braced Format:
Microsoft: {123e4567-e89b-12d3-a456-426614174000}
URN Format:
URN: urn:uuid:123e4567-e89b-12d3-a456-426614174000
Binary Representation
128-bit binary: 16 bytes
Hex representation: 32 hexadecimal characters
Base64 representation: 22 characters (with padding)
Advanced Generation Options
Bulk Generation Strategies
Performance Optimized:
// Generate 10,000 UUIDs efficiently
const uuids = [];
const batchSize = 1000;
for (let i = 0; i < 10000; i += batchSize) {
const batch = generateUUIDBatch(batchSize);
uuids.push(...batch);
// Yield to browser to prevent UI blocking
if (i % (batchSize 10) === 0) {
await new Promise(resolve => setTimeout(resolve, 0));
}
}
Memory Efficient:
// Stream generation for very large sets function
uuidGenerator(count) { for (let i = 0; i < count; i++) { yield generateUUIDv4(); } } // Use generator to avoid memory issues const uuidStream = uuidGenerator(100000); for (const uuid of uuidStream) { processUUID(uuid); }
Custom Namespace Management
Creating Namespaces:
// DNS namespace (predefined)
const DNS_NAMESPACE = "6ba7b810-9dad-11d1-80b4-00c04fd430c8";
// URL namespace (predefined)
const URL_NAMESPACE = "6ba7b811-9dad-11d1-80b4-00c04fd430c8";
// Custom namespace
const CUSTOM_NAMESPACE = generateUUIDv4(); // Create once, reuse
Namespace-based Generation:
// Generate deterministic UUIDs
const userUUID = generateUUIDv5(CUSTOM_NAMESPACE, "user123");
const sessionUUID = generateUUIDv5(CUSTOM_NAMESPACE, "session456");
// Same inputs always produce same UUIDs
console.log(generateUUIDv5(DNS_NAMESPACE, "example.com"));
// Always: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Validation and Analysis
Format Validation:
const validateUUID = (uuid) => {
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-6][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return {
isValid: uuidRegex.test(uuid),
version: parseInt(uuid.charAt(14), 16),
variant: getVariant(uuid.charAt(19)),
format: detectFormat(uuid)
};
};
const getVariant = (char) => {
const variants = {
'8': 'RFC 4122',
'9': 'RFC 4122',
'a': 'RFC 4122',
'b': 'RFC 4122',
'c': 'Microsoft',
'd': 'Microsoft',
'e': 'Future',
'f': 'Future'
};
return variants[char.toLowerCase()] || 'Unknown';
};
Collision Detection:
const detectCollisions = (uuids) => {
const uniqueUUIDs = new Set(uuids);
const collisions = uuids.length - uniqueUUIDs.size;
return {
total: uuids.length,
unique: uniqueUUIDs.size,
collisions: collisions,
collisionRate: collisions / uuids.length
};
};
Best Practices
1. Version Selection Guidelines
Choose v4 for:
✅ General purpose identifiers
✅ Database primary keys
✅ API endpoints
✅ Session identifiers
✅ Maximum security/privacy
Choose v1 for:
✅ Time-ordered sequences
✅ Event logging
✅ Audit trails
✅ When MAC address exposure is acceptable
Choose v5 for:
✅ Deterministic generation
✅ Content-based identifiers
✅ URL mapping
✅ When same input should produce same UUID
2. Storage Optimization
Database Storage:
-- PostgreSQL: Native UUID type (128 bits)
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255)
);
-- MySQL: Binary storage (most efficient)
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255)
);
-- String storage (less efficient but readable)
CREATE TABLE users (
id CHAR(36) PRIMARY KEY,
name VARCHAR(255)
);
Index Performance:
-- UUID v4: Random distribution (good for write performance)
-- UUID v1: Time-ordered (good for range queries)
-- For v4 UUIDs, consider clustering by other columns
CREATE CLUSTERED INDEX IX_users_created_at ON users(created_at);
3. Application Integration
Language-Specific Libraries:
Python
import uuid
uuid_v4 = uuid.uuid4()
uuid_v1 = uuid.uuid1()
uuid_v5 = uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com')
// JavaScript (Node.js)
const { v1: uuidv1, v4: uuidv4, v5: uuidv5 } = require('uuid');
const uuid_v4 = uuidv4();
const uuid_v1 = uuidv1();
const uuid_v5 = uuidv5('example.com', uuidv5.DNS);
// Java
import java.util.UUID;
UUID uuid_v4 = UUID.randomUUID();
UUID uuid_from_string = UUID.fromString("123e4567-e89b-12d3-a456-426614174000");
4. Security Considerations
Information Leakage:
UUID v1: ⚠️ Contains MAC address and timestamp
- Can reveal hardware information
- Enables tracking across systems
- Consider v6 for time-ordering without MAC
UUID v4: ✅ No information leakage
- Purely random
- No embedded data
- Cryptographically secure
Predictability:
// ✅ Secure: Using crypto.getRandomValues()
const secureUUID = crypto.getRandomValues(new Uint8Array(16));
// ❌ Insecure: Using Math.random()
const insecureUUID = generateUUIDFromMathRandom(); // Predictable!
Common Use Cases
1. Database Primary Keys
Traditional Auto-increment vs UUID:
-- Auto-increment (traditional)
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY, -- Predictable, sequential
customer_id INT,
total DECIMAL(10,2)
);
-- UUID Primary Key (modern)
CREATE TABLE orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- Unpredictable
customer_id UUID,
total DECIMAL(10,2)
);
Benefits of UUID Primary Keys:
- No coordination needed across distributed systems
- Merge databases without ID conflicts
- Hide business information (record count, creation order)
- Enable offline ID generation
2. Distributed Systems
Microservices Architecture:
// Each service can generate unique IDs independently
const orderService = {
createOrder: (customerData) => {
const orderId = generateUUIDv4();
const customerId = customerData.id; // Also UUID
return {
id: orderId,
customerId: customerId,
items: [],
status: 'created'
};
}
};
// No need for coordination between services
const inventoryService = {
reserveItems: (orderId, items) => {
const reservationId = generateUUIDv4();
// Use orderId from other service safely
}
};
3. Session Management
Web Session Identifiers:
const sessionManager = {
createSession: (userId) => {
const sessionId = generateUUIDv4();
const session = {
id: sessionId,
userId: userId,
createdAt: new Date(),
expiresAt: new Date(Date.now() + 24 60 60 1000) // 24 hours
};
sessionStore.set(sessionId, session);
return sessionId;
},
validateSession: (sessionId) => {
// UUID format provides initial validation
if (!isValidUUID(sessionId)) {
return null;
}
return sessionStore.get(sessionId);
}
};
4. File and Resource Management
File Upload System:
const fileUploadHandler = {
processUpload: (file) => {
const fileId = generateUUIDv4();
const fileName = `${fileId}_${file.originalName}`;
// Store with UUID to prevent conflicts and enhance security
const filePath = `/uploads/${fileId.substring(0, 2)}/${fileId.substring(2, 4)}/${fileName}`;
return {
id: fileId,
originalName: file.originalName,
storagePath: filePath,
url: `/api/files/${fileId}`
};
}
};
5. API Development
RESTful API Resource Identifiers:
// API routes with UUID parameters
app.get('/api/users/:userId', (req, res) => {
const userId = req.params.userId;
// Validate UUID format first
if (!isValidUUID(userId)) {
return res.status(400).json({ error: 'Invalid user ID format' });
}
// Proceed with business logic
const user = userService.findById(userId);
res.json(user);
});
// Generate correlation IDs for request tracking
app.use((req, res, next) => {
req.correlationId = generateUUIDv4();
res.setHeader('X-Correlation-ID', req.correlationId);
next();
});
6. Event Sourcing and CQRS
Event Stream Identifiers:
const eventStore = {
appendEvent: (streamId, event) => {
const eventId = generateUUIDv4();
const eventWithId = {
...event,
id: eventId,
streamId: streamId,
timestamp: new Date(),
version: getNextVersion(streamId)
};
return store.append(streamId, eventWithId);
},
getEventStream: (streamId) => {
// streamId is also a UUID for the aggregate
return store.getEvents(streamId);
}
};
// Aggregate root with UUID identity
class Order {
constructor() {
this.id = generateUUIDv4();
this.events = [];
}
addItem(item) {
const event = {
type: 'ItemAdded',
itemId: generateUUIDv4(),
...item
};
this.applyEvent(event);
}
}
Integration Examples
Frontend JavaScript
React Component:
import React, { useState } from 'react';
import { v4 as uuidv4 } from 'uuid';
const TodoList = () => {
const [todos, setTodos] = useState([]);
const addTodo = (text) => {
const newTodo = {
id: uuidv4(), // Generate unique ID
text: text,
completed: false,
createdAt: new Date()
};
setTodos([...todos, newTodo]);
};
return (
{todos.map(todo => (
))}
);
};
Backend Node.js
Express.js API:
const express = require('express');
const { v4: uuidv4 } = require('uuid');
const app = express();
// Create resource with UUID
app.post('/api/articles', (req, res) => {
const article = {
id: uuidv4(),
title: req.body.title,
content: req.body.content,
authorId: req.user.id, // Also UUID
createdAt: new Date()
};
articleService.save(article);
res.status(201).json(article);
});
// Get resource by UUID
app.get('/api/articles/:id', (req, res) => {
const articleId = req.params.id;
// Validate UUID format
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
if (!uuidRegex.test(articleId)) {
return res.status(400).json({ error: 'Invalid article ID' });
}
const article = articleService.findById(articleId);
res.json(article);
});
Python Django
Model Definition:
from django.db import models
import uuid
class Article(models.Model):
id = models.UUIDField(
primary_key=True,
default=uuid.uuid4,
editable=False
)
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('User', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'articles'
Usage in views
def create_article(request):
article = Article.objects.create(
title=request.data['title'],
content=request.data['content'],
author=request.user
)
# article.id is automatically generated UUID
return Response({'id': str(article.id)})
Database Schemas
PostgreSQL:
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- Table with UUID primary key
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
email VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Foreign key relationship with UUIDs
CREATE TABLE posts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID NOT NULL REFERENCES users(id),
title VARCHAR(255) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Index on UUID column
CREATE INDEX idx_posts_user_id ON posts(user_id);
Troubleshooting
Common Issues & Solutions
1. UUID Format Validation Errors
Problem: "Invalid UUID format" errors
Solutions:
- Check for correct hyphen placement (8-4-4-4-12 pattern)
- Verify hexadecimal characters only (0-9, a-f, A-F)
- Ensure correct version digit (position 15)
- Validate variant bits (position 20)
// Comprehensive UUID validation
const validateUUID = (uuid) => {
const formats = {
standard: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-6][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,
compact: /^[0-9a-f]{32}$/i,
braced: /^\{[0-9a-f]{8}-[0-9a-f]{4}-[1-6][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\}$/i
};
for (const [format, regex] of Object.entries(formats)) {
if (regex.test(uuid)) {
return { valid: true, format: format };
}
}
return { valid: false, format: null };
};
2. Performance Issues with Bulk Generation
Problem: Browser becomes unresponsive during large UUID generation
Solutions:
- Use Web Workers for background generation
- Implement batched generation with yields
- Limit single-operation size (max 10,000)
- Stream processing for very large sets
// Web Worker for UUID generation
const worker = new Worker('uuid-worker.js');
worker.postMessage({ count: 50000, version: 4 });
worker.onmessage = (e) => {
const uuids = e.data.uuids;
displayResults(uuids);
};
3. Database Performance with UUID Primary Keys
Problem: Slow queries or high index fragmentation
Solutions:
- Use UUID v1 or v6 for time-ordered insertion
- Consider clustered indexes on other columns
- Use proper UUID storage types (not VARCHAR)
- Optimize queries with UUID-specific patterns
-- Optimize UUID storage and indexing
-- PostgreSQL: Use UUID type, not TEXT
ALTER TABLE users ALTER COLUMN id TYPE UUID USING id::UUID;
-- MySQL: Use BINARY(16) for storage efficiency
ALTER TABLE users
MODIFY id BINARY(16) PRIMARY KEY,
ADD INDEX idx_created_at(created_at); -- Cluster by timestamp instead
4. Memory Usage with Large UUID Sets
Problem: Out of memory when generating/storing many UUIDs
Solutions:
- Use generators instead of arrays
- Process UUIDs in streams
- Clear processed UUIDs from memory
- Implement pagination for display
// Memory-efficient UUID processing function
processUUIDs(count) { for (let i = 0; i < count; i++) { const uuid = generateUUID(); yield uuid; // Process immediately, don't store processUUID(uuid); } } // Use generator to avoid memory buildup for (const uuid of processUUIDs(1000000)) { // UUID is processed and released }
5. Version-Specific Issues
UUID v1 MAC Address Problems:
// Handle systems without MAC address access
const generateUUIDv1Safe = () => {
try {
return generateUUIDv1();
} catch (error) {
console.warn('MAC address not available, using random node');
return generateUUIDv1({ node: crypto.getRandomValues(new Uint8Array(6)) });
}
};
UUID v5 Namespace Issues:
// Validate namespace UUID before using
const generateUUIDv5Safe = (namespace, name) => {
if (!isValidUUID(namespace)) {
throw new Error('Invalid namespace UUID');
}
if (!name || typeof name !== 'string') {
throw new Error('Name must be a non-empty string');
}
return generateUUIDv5(namespace, name);
};
Conclusion
Our UUID Generator provides comprehensive tools for creating universally unique identifiers for any application. Whether you need simple random UUIDs for database keys or deterministic namespace-based UUIDs for content addressing, our tool ensures compliance with standards and optimal performance.
Key Benefits:
- ✅ Standards Compliant: Full RFC 4122 compliance across all versions
- ✅ Multiple Versions: Support for v1, v3, v4, v5, and v6 generation
- ✅ Bulk Generation: Create thousands of UUIDs instantly
- ✅ Format Flexibility: Standard, compact, and custom formatting options
- ✅ Validation Tools: Built-in format and version validation
- ✅ Privacy Focused: All generation happens locally in your browser
Start generating unique identifiers today with our UUID Generator and build distributed systems with confidence.
Last updated: January 2025 | DevToolMint - Professional Developer Tools