UUID v7 Generator
डेटाबेस प्राइमरी कीज के लिए टाइम-ऑर्डर्ड UUID v7 जनरेट करें
…
फ़ॉर्मेट करें
UUID v7 क्या है?
UUID v7 एक अगली पीढ़ी का UUID प्रारूप है जो RFC 9562 (मई 2024) में मानकीकृत है। यह सर्वाधिक-महत्वपूर्ण bits में 48-bit Unix millisecond timestamp अंकित करता है, उसके बाद version और variant markers, और शेष bits को cryptographically secure यादृच्छिक डेटा से भरता है।
क्योंकि timestamp उच्च bits में है, UUID v7 मान कालक्रमानुसार क्रमबद्ध होते हैं — lexicographically और संख्यात्मक दोनों रूप से। यह database primary keys के लिए उत्कृष्ट विकल्प है जहाँ यादृच्छिक UUIDs (v4) B-tree index में विखंडन उत्पन्न करते हैं।
यादृच्छिक UUIDs Database Indexes को Fragment क्यों करते हैं
B-tree indexes — PostgreSQL, MySQL, SQLite, और अधिकांश databases द्वारा उपयोग किए जाते हैं — rows को key value के अनुसार क्रमबद्ध रखते हैं।
UUID v4 (पूर्णतः यादृच्छिक) के साथ, हर नया insert index tree में अनिवार्यतः यादृच्छिक स्थान पर पहुँचता है। इससे database को index pages निरंतर पढ़ने और पुनर्लेखन करने पर विवश होना पड़ता है, पूर्ण pages विभाजित होती हैं और अन्य आधी-खाली रहती हैं।
UUID v7 Bit विन्यास
UUID v7 128 bits चौड़ा है, छः फ़ील्ड में विभाजित:
| Bits | Field | उद्देश्य |
|---|---|---|
| 48 | unix_ts_ms | Milliseconds में 48-bit Unix timestamp — पूरे उच्च half को घेरता है |
| 4 | ver | Version संख्या — हमेशा 0111 (दशमलव 7) |
| 12 | rand_a | 12 bits cryptographically secure यादृच्छिक डेटा |
| 2 | var | Variant marker — हमेशा 10 (RFC 4122 वेरिएंट) |
| 62 | rand_b | 62 bits cryptographically secure यादृच्छिक डेटा |
Timestamp सटीकता 1 millisecond है। एक ही millisecond में, UUID v7 मान उनके यादृच्छिक suffix द्वारा क्रमबद्ध हैं — sub-millisecond गारंटीकृत एकदिशीय वृद्धि नहीं, लेकिन k-sortable: समय में करीब उत्पन्न किए गए IDs index में करीब क्रमबद्ध होंगे।
UUID v7 बनाम UUID v1
UUID v1 और UUID v7 दोनों timestamp समाहित करते हैं, लेकिन संरचना में महत्वपूर्ण रूप से भिन्न हैं:
| विशेषता | UUID v7 | UUID v1 |
|---|---|---|
| Epoch / समय आधार | Unix epoch (Jan 1, 1970) | Gregorian epoch (Oct 15, 1582) |
| समय सटीकता | 1 millisecond | 100 nanoseconds |
| क्रमबद्धता | हाँ — संरचना से k-sortable | नहीं — time fields UUID विन्यास में बिखरे हैं |
| गोपनीयता | कोई host जानकारी उजागर नहीं | उत्पन्न करने वाले host का MAC address समाहित करता है |
| DB Index प्रदर्शन | उत्कृष्ट — क्रमिक inserts, न्यूनतम विखंडन | कमज़ोर — timestamp के बावजूद अक्रमिक |
| मानक | RFC 9562 (2024) | RFC 4122 (2005) |
| मूल Browser समर्थन | अभी नहीं (कोई crypto.randomUUID v7 नहीं) | मूल रूप से उपलब्ध नहीं |
किसी भी नए project के लिए जिसे time-ordered UUIDs चाहिए, UUID v1 की बजाय UUID v7 को प्राथमिकता दें। UUID v1 पुराना है और host जानकारी उजागर करता है।
UUID v7 बनाम ULID
ULID UUID v7 के समान समस्या हल करता है। तुलना करें:
- RFC 9562 UUID मानक का अनुसरण करता है — सभी UUID tooling के साथ संगत
- Hyphenated hex प्रारूप — सर्वत्र मान्यता प्राप्त
- मूल database UUID column समर्थन
- कुल 128 bits
- Crockford Base32 एन्कोडिंग — 26 अक्षर, थोड़ा अधिक संक्षिप्त
- Case-insensitive और अस्पष्ट अक्षरों (I, L, O, U) से बचता है
- एक नज़र में अधिक मानव-पठनीय
- Library आवश्यक है — कोई मूल platform समर्थन नहीं
यदि आप पहले से UUID ecosystem में हैं (PostgreSQL uuid column, REST APIs जो UUIDs लौटाती हैं), UUID v7 उपयोग करें। यदि आप नई शुरुआत कर रहे हैं और मानव-अनुकूल एन्कोडिंग को प्राथमिकता देते हैं, ULID एक उचित विकल्प है।
Databases में UUID v7 का उपयोग
UUID v7 अभी तक अधिकांश databases द्वारा मूल रूप से उत्पन्न नहीं किया जाता, लेकिन मानक UUID columns में संग्रहीत किया जा सकता है:
uuid column में संग्रहीत करें। pg-uuidv7 extension uuid_generate_v7() server-side function जोड़ता है यदि DB-generated IDs चाहिए।BINARY(16) या CHAR(36) column में संग्रहीत करें। Application code में उत्पन्न करें।TEXT (36 अक्षर) या BLOB (16 bytes) के रूप में संग्रहीत करें। TEXT पर lexicographic sort सही काम करता है क्योंकि UUID v7 निश्चित-चौड़ाई timestamp prefix उपयोग करता है।Code उदाहरण
UUID v7 अभी crypto.randomUUID() के माध्यम से उपलब्ध नहीं है। मूल समर्थन आने तक uuidv7 (npm) जैसी library उपयोग करें:
function generateUuidV7() {
const buf = new Uint8Array(16)
crypto.getRandomValues(buf)
const ms = BigInt(Date.now())
// Embed 48-bit Unix ms timestamp
buf[0] = Number((ms >> 40n) & 0xFFn)
buf[1] = Number((ms >> 32n) & 0xFFn)
buf[2] = Number((ms >> 24n) & 0xFFn)
buf[3] = Number((ms >> 16n) & 0xFFn)
buf[4] = Number((ms >> 8n) & 0xFFn)
buf[5] = Number(ms & 0xFFn)
// Set version 7 (0111xxxx)
buf[6] = (buf[6] & 0x0F) | 0x70
// Set variant (10xxxxxx)
buf[8] = (buf[8] & 0x3F) | 0x80
const hex = [...buf].map(b => b.toString(16).padStart(2, '0')).join('')
return `${hex.slice(0,8)}-${hex.slice(8,12)}-${hex.slice(12,16)}-${hex.slice(16,20)}-${hex.slice(20)}`
}
// Node.js 20+ built-in
// import { randomUUID } from 'node:crypto' // v4 only — no v7 yet in stdlib# pip install uuid7 import uuid_extensions uid = uuid_extensions.uuid7() print(uid) # e.g. 018e2b3d-1a2b-7000-8000-abc123456789 print(uid.time) # Unix ms timestamp embedded in the UUID # Or as a plain string from uuid_extensions import uuid7str print(uuid7str())
-- PostgreSQL 13+ extension-free implementation
CREATE OR REPLACE FUNCTION uuid_generate_v7()
RETURNS uuid
LANGUAGE sql
AS $$
SELECT encode(
set_bit(
set_bit(
overlay(
uuid_send(gen_random_uuid())
PLACING substring(int8send(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint) FROM 3)
FROM 1 FOR 6
),
52, 1
),
53, 1
),
'hex'
)::uuid;
$$;
-- Usage as a default primary key
CREATE TABLE events (
id uuid PRIMARY KEY DEFAULT uuid_generate_v7(),
payload jsonb,
created_at timestamptz DEFAULT now()
);function extractTimestamp(uuid: string): Date {
const hex = uuid.replace(/-/g, '')
const ms = parseInt(hex.slice(0, 12), 16) // first 48 bits = ms timestamp
return new Date(ms)
}
const uid = '018e2b3d-1a2b-7000-8000-abc123456789'
console.log(extractTimestamp(uid).toISOString())
// → "2024-03-15T10:22:05.259Z"