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 चौड़ा है, छः फ़ील्ड में विभाजित:

BitsFieldउद्देश्य
48unix_ts_msMilliseconds में 48-bit Unix timestamp — पूरे उच्च half को घेरता है
4verVersion संख्या — हमेशा 0111 (दशमलव 7)
12rand_a12 bits cryptographically secure यादृच्छिक डेटा
2varVariant marker — हमेशा 10 (RFC 4122 वेरिएंट)
62rand_b62 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 v7UUID v1
Epoch / समय आधारUnix epoch (Jan 1, 1970)Gregorian epoch (Oct 15, 1582)
समय सटीकता1 millisecond100 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 के समान समस्या हल करता है। तुलना करें:

UUID v7
  • RFC 9562 UUID मानक का अनुसरण करता है — सभी UUID tooling के साथ संगत
  • Hyphenated hex प्रारूप — सर्वत्र मान्यता प्राप्त
  • मूल database UUID column समर्थन
  • कुल 128 bits
ULID
  • 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 में संग्रहीत किया जा सकता है:

PostgreSQL
PostgreSQL: uuid column में संग्रहीत करें। pg-uuidv7 extension uuid_generate_v7() server-side function जोड़ता है यदि DB-generated IDs चाहिए।
MySQL / MariaDB
MySQL / MariaDB: BINARY(16) या CHAR(36) column में संग्रहीत करें। Application code में उत्पन्न करें।
SQLite
SQLite: TEXT (36 अक्षर) या BLOB (16 bytes) के रूप में संग्रहीत करें। TEXT पर lexicographic sort सही काम करता है क्योंकि UUID v7 निश्चित-चौड़ाई timestamp prefix उपयोग करता है।

Code उदाहरण

UUID v7 अभी crypto.randomUUID() के माध्यम से उपलब्ध नहीं है। मूल समर्थन आने तक uuidv7 (npm) जैसी library उपयोग करें:

JavaScript (browser / Node.js 20+)
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
Python (uuid7 library)
# 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 — generate UUID v7
-- 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()
);
TypeScript — extract timestamp from UUID v7
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"

अक्सर पूछे जाने वाले प्रश्न

क्या UUID v7 UUID v4 के साथ पश्चगामी संगत है?
हाँ। UUID v7 सभी UUID संस्करणों के समान 128-bit, 32-hex-digit, hyphenated wire format उपयोग करता है। कोई भी सिस्टम जो UUIDs संग्रहीत या प्रेषित करता है वो बिना बदलाव के UUID v7 स्वीकार करेगा।
क्या UUID v7 उत्पादन timestamp उजागर करता है?
हाँ — पहले 48 bits Unix millisecond timestamp हैं, इसलिए UUID v7 वाला कोई भी अनुमानित उत्पादन समय निर्धारित कर सकता है। यदि निर्माण समय उजागर होना चिंताजनक है, UUID v4 उपयोग करें।
क्या UUID v7 को अलग created_at column के बिना database primary key के रूप में उपयोग किया जा सकता है?
हाँ। UUID v7 millisecond-सटीकता timestamp समाहित करता है। हालाँकि, स्पष्टता और indexability के लिए कई teams अभी भी स्पष्ट created_at column रखती हैं।
UUID v7 में कितनी entropy है?
UUID v7 में 74 bits यादृच्छिक डेटा है (rand_a में 12 bits + rand_b में 62 bits)। यह UUID v4 के 122 bits से थोड़ा कम है लेकिन व्यावहारिक उपयोग के लिए अत्यंत विशाल टकराव-मुक्त space प्रदान करता है।
क्या UUID v7 browsers या Node.js में मूल रूप से समर्थित है?
2025 की शुरुआत तक नहीं। अभी के लिए uuidv7 npm package उपयोग करें। मूल समर्थन crypto.randomUUID({ version: 7 }) या समान APIs के माध्यम से भविष्य के संस्करणों में आ सकता है।