JavaScript में UUID v4 कैसे बनाएं

·TypeScript & Full-stack Developer·समीक्षकMarcus Webb·प्रकाशित

मुफ़्त UUID v4 Generator को सीधे अपने ब्राउज़र में उपयोग करें — इंस्टॉलेशन की ज़रूरत नहीं।

UUID v4 Generator ऑनलाइन आज़माएं →

हर JavaScript एप्लिकेशन को कभी न कभी यूनिक आइडेंटिफायर की जरूरत होती है — सेशन टोकन, डेटाबेस row, payment API के लिए idempotency key, distributed tracing के लिए correlation ID। आज JavaScript में UUID v4 जनरेट करने का सबसे सरल तरीका है crypto.randomUUID(): zero dependencies, एक लाइन, cryptographically secure। UUID v4 इसीलिए इतना popular है क्योंकि इसमें services के बीच कोई coordination नहीं चाहिए — client और server दोनों independently बिना collision risk के ID बना सकते हैं। यह गाइड उस बिल्ट-इन API, uuid npm पैकेज, और validation — सभी Node.js 19+ और आधुनिक ब्राउज़र पर — को कवर करती है। नो-कोड विकल्प के लिए, ToolDeck पर UUID v4 Generator तुरंत RFC-अनुपालक आइडेंटिफायर बनाता है।

  • crypto.randomUUID() ब्राउज़र और Node.js में बिल्ट-इन है — zero dependencies, एक लाइन कोड।
  • UUID v4 एक 128-bit रैंडम आइडेंटिफायर है: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx (y 8, 9, a, या b है)।
  • /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i से वैलिडेट करें — वर्शन और वेरिएंट बिट्स जाँचता है।
  • uuid npm पैकेज v1, v3, v5, और v7 सपोर्ट जोड़ता है जब आपको रैंडम ID से अधिक की जरूरत हो।
  • डेटाबेस प्राइमरी key के लिए, इंडेक्स fragmentation कम करने के लिए v4 (रैंडम) की जगह UUID v7 (time-ordered) पसंद करें।

UUID v4 क्या है?

UUID (Universally Unique Identifier) वर्शन 4 एक 128-bit रैंडम आइडेंटिफायर है जो चार हाइफ़न से अलग किए 32 हेक्साडेसिमल अंकों के रूप में फॉर्मेट होता है: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx। पोजीशन 15 पर 4 वर्शन को दर्शाता है। पोजीशन 20 पर y कैरेक्टर 8, 9, a, या b में से एक है (RFC 4122 वेरिएंट)। शेष 122 बिट्स रैंडम हैं। UUID v4 JavaScript एप्लिकेशन में सबसे सामान्य वर्शन है क्योंकि इसे systems के बीच coordination की आवश्यकता नहीं होती — आप client और server पर स्वतंत्र रूप से ID जनरेट कर सकते हैं।

Before · javascript
After · javascript
// No identifier
const event = { action: "user.login", ts: 1711824000 };
// With UUID v4
const event = {
  id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  action: "user.login",
  ts: 1711824000
};

crypto.randomUUID() — नेटिव JavaScript तरीका

crypto.randomUUID() Chrome 92+, Firefox 95+, Safari 15.4+, और Node.js 19+ में उपलब्ध है (Node.js 14.17.0 से globalThis.crypto के पीछे प्रयोगात्मक सपोर्ट के साथ)। यह एक लोअरकेस 36-कैरेक्टर UUID v4 स्ट्रिंग लौटाता है। ब्राउज़र JavaScript में कोई import नहीं चाहिए। Node.js में, आप इसे ग्लोबल crypto ऑब्जेक्ट पर सीधे कॉल कर सकते हैं या node:crypto मॉड्यूल से स्पष्ट रूप से import कर सकते हैं।

JavaScript — ब्राउज़र (zero imports)
// किसी भी आधुनिक ब्राउज़र में काम करता है — कोई build step नहीं, कोई bundler नहीं
const requestId = crypto.randomUUID();
console.log(requestId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

// Use it wherever you need a unique identifier
const telemetryEvent = {
  event_id: crypto.randomUUID(),
  action: "checkout.started",
  session_id: crypto.randomUUID(),
  timestamp: Date.now(),
  cart_total_cents: 14999,
};
console.log(JSON.stringify(telemetryEvent, null, 2));
Node.js — दो समकक्ष तरीके
// Approach 1: global crypto (Node.js 19+)
const orderId = crypto.randomUUID();
console.log(orderId);
// "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d"

// Approach 2: explicit import from node:crypto
import { randomUUID } from 'node:crypto';
const correlationId = randomUUID();
console.log(correlationId);
// "f7e6d5c4-b3a2-4190-8f7e-6d5c4b3a2190"

crypto.randomUUID को feature-detect करना उचित है यदि आपका कोड पुराने ब्राउज़र या embedded WebView में चल सकता है। जाँच एक सिंगल typeof गार्ड है:

JavaScript — fallback के साथ feature detection
function generateUUIDv4() {
  // Prefer the native API when available
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    return crypto.randomUUID();
  }

  // Manual fallback using getRandomValues (see next section)
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Set version (4) and variant (RFC 4122)
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return [
    hex.slice(0, 4).join(''),
    hex.slice(4, 6).join(''),
    hex.slice(6, 8).join(''),
    hex.slice(8, 10).join(''),
    hex.slice(10, 16).join(''),
  ].join('-');
}

console.log(generateUUIDv4());
// "9b2e4f1a-7c3d-4e8f-a5b6-0d2c1e9f8a7b"
नोट:सुरक्षित संदर्भों (HTTPS पेज, localhost, ब्राउज़र एक्सटेंशन) में, crypto.randomUUID() हमेशा उपलब्ध है। कुछ ब्राउज़र में non-secure HTTP पेज पर यह error फेंकता है। यदि आपका एप्लिकेशन development के दौरान कभी plain HTTP पर चलता है, तो ऊपर दिया गया getRandomValues fallback उस स्थिति को संभालता है।

लाइब्रेरी के बिना UUID v4 जनरेट करें

कभी-कभी आप crypto.randomUUID() पर भरोसा नहीं कर सकते — शायद आप एक ऐसे WebView को target कर रहे हैं जो crypto API को strip करता है, या आप समझना चाहते हैं कि under the hood क्या होता है। मैन्युअल तरीका crypto.getRandomValues() (IE 11 से उपलब्ध) का उपयोग 16 bytes को रैंडम डेटा से भरने के लिए करता है, फिर version और variant फ़ील्ड सेट करने के लिए दो bitmask ऑपरेशन लागू करता है। ये दो ऑपरेशन UUID v4 और pure random byte string के बीच एकमात्र अंतर हैं।

JavaScript — getRandomValues के साथ मैन्युअल UUID v4
function uuidv4Manual() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);

  // Set version: bits 12–15 of byte 6 = 0100 (version 4)
  bytes[6] = (bytes[6] & 0x0f) | 0x40;

  // Set variant: bits 6–7 of byte 8 = 10 (RFC 4122)
  bytes[8] = (bytes[8] & 0x3f) | 0x80;

  const hex = [...bytes].map(b => b.toString(16).padStart(2, '0'));

  return (
    hex.slice(0, 4).join('') + '-' +
    hex.slice(4, 6).join('') + '-' +
    hex.slice(6, 8).join('') + '-' +
    hex.slice(8, 10).join('') + '-' +
    hex.slice(10, 16).join('')
  );
}

const traceId = uuidv4Manual();
console.log(traceId);
// "e4d7c2a1-3f9b-48e5-a612-9d8c7b6a5f4e"

// Verify it passes UUID v4 validation
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
console.log(UUID_V4_RE.test(traceId)); // true
चेतावनी:UUID जनरेट करने के लिए Math.random() का कभी उपयोग न करें। यह क्रिप्टोग्राफिक रूप से सुरक्षित नहीं है, इसका आउटपुट period बहुत छोटा है, और कुछ engines predictable sequence बनाते हैं। हमेशा crypto.getRandomValues() या crypto.randomUUID() का उपयोग करें।

uuid npm पैकेज — Multi-Version सपोर्ट

npm पर uuid पैकेज crypto.randomUUID() आने से पहले JavaScript का go-to UUID library था। तीन स्थितियों में यह अभी भी उपयोगी है: जब आपको v4 के अलावा UUID वर्शन चाहिए (v1, v3, v5, v7), जब आप Node.js 14.17.0 से पुराने रनटाइम को target करते हैं, या जब आप validate और parse utility functions चाहते हैं। आधुनिक runtime पर plain UUID v4 के लिए, native API पर्याप्त है और मैं dependency छोड़ दूँगा।

bash — इंस्टॉल करें
npm install uuid
JavaScript — v4 generation के लिए uuid पैकेज
import { v4 as uuidv4, validate, version } from 'uuid';

// Generate a UUID v4
const paymentId = uuidv4();
console.log(paymentId);
// "1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed"

// Validate any UUID string
console.log(validate(paymentId));    // true
console.log(validate("not-a-uuid")); // false

// Detect the version of a UUID
console.log(version(paymentId));     // 4

// Generate a batch for seeding a test database
const testAccounts = Array.from({ length: 5 }, () => ({
  account_id: uuidv4(),
  plan: "starter",
  created_at: new Date().toISOString(),
}));
console.log(testAccounts);
नोट:uuid पैकेज internally ब्राउज़र में crypto.getRandomValues() और Node.js में crypto.randomBytes() का उपयोग करता है, इसलिए एंट्रॉपी स्रोत native API के समान है। अंतर केवल additional utility functions और multi-version सपोर्ट है।

यदि आप बिल्कुल कोड नहीं लिखना चाहते, तो UUID v4 Generator आज़माएं — यह एक क्लिक से आपके ब्राउज़र में RFC 4122-अनुपालक v4 आइडेंटिफायर बनाता है।

Deterministic UUID — स्ट्रिंग से UUID v5 जनरेट करना

UUID v4 परिभाषा से रैंडम है — इसे दो बार कॉल करने पर हमेशा अलग परिणाम मिलते हैं। कभी-कभी आपको इसका उलटा चाहिए: एक ही input string हमेशा एक ही UUID बनाए। यही UUID v5 करता है। यह SHA-1 के साथ एक namespace UUID और input string को hash करता है, फिर परिणाम को UUID के रूप में format करता है। एक ही namespace + एक ही input = एक ही output, हर बार, हर मशीन पर। यह URL, email address, या किसी भी string जो पहले से किसी resource को identify करती है, से stable ID derive करने के लिए उपयोगी है।

JavaScript — deterministic ID के लिए uuid v5
import { v5 as uuidv5 } from 'uuid';

// Built-in namespace for URLs (RFC 4122)
const URL_NAMESPACE = uuidv5.URL;
// "6ba7b811-9dad-11d1-80b4-00c04fd430c8"

// Same URL always produces the same UUID
const pageId1 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
const pageId2 = uuidv5("https://api.warehouse.dev/products/sku-7291", URL_NAMESPACE);
console.log(pageId1 === pageId2); // true
console.log(pageId1);
// "a6e4e1c0-7e23-5d3b-8f14-9c2a1b3d5e7f"

// Custom namespace for your application
const APP_NAMESPACE = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
const tenantId = uuidv5("acme-corp", APP_NAMESPACE);
console.log(tenantId);
// "d4735e3a-265b-564e-8f32-7a1b2c3d4e5f"

एक बात: UUID v3 SHA-1 की जगह MD5 के साथ वही काम करता है। नए प्रोजेक्ट के लिए v5 पसंद करें। MD5 में ज्ञात collision कमजोरियाँ हैं, और हालांकि ID generation के लिए यह बहुत मायने नहीं रखता, जब दोनों उपलब्ध हों तो SHA-1 की जगह MD5 चुनने का कोई कारण नहीं है।

crypto.randomUUID() और संबंधित API संदर्भ

नेटिव crypto.randomUUID() कोई argument नहीं लेता — यह केवल एक string लौटाता है। इसका उपयोग तब करें जब आपको शून्य dependencies के साथ RFC 4122 अनुपालक आइडेंटिफायर चाहिए। जब आपको formatted UUID string की बजाय raw random bytes चाहिए — उदाहरण के लिए, typed array भरने या key derive करने के लिए — तो crypto.getRandomValues() सीधे उपयोग करें। UUID कार्य के लिए महत्वपूर्ण संबंधित API नीचे सूचीबद्ध हैं।

प्रॉपर्टी / मेथड
रिटर्न टाइप
विवरण
crypto.randomUUID()
string
हाइफ़न के साथ लोअरकेस हेक्साडेसिमल में 36-अक्षर की UUID v4 स्ट्रिंग लौटाता है
crypto.getRandomValues(arr)
TypedArray
एक typed array को क्रिप्टोग्राफिक रूप से रैंडम मानों से भरता है — मैन्युअल UUID जनरेशन का आधार
URL.createObjectURL(blob)
string
एक यूनिक blob URL बनाता है (UUID नहीं है, लेकिन कभी-कभी भ्रमित किया जाता है)

UUID v4 regex पैटर्न विवरण:

सेगमेंट
पैटर्न
अर्थ
[0-9a-f]{8}
xxxxxxxx
पहले 8 हेक्स अंक — 32 रैंडम बिट्स
[0-9a-f]{4}
xxxx
अगले 4 हेक्स अंक — 16 रैंडम बिट्स
4[0-9a-f]{3}
4xxx
वर्शन निबल 4 पर फिक्स है, उसके बाद 12 रैंडम बिट्स
[89ab][0-9a-f]{3}
yxxx
वेरिएंट निबल 8, 9, a, या b में से एक है — उसके बाद 12 रैंडम बिट्स
[0-9a-f]{12}
xxxxxxxxxxxx
अंतिम 12 हेक्स अंक — 48 रैंडम बिट्स

Regex से UUID v4 वैलिडेट करें

यह verify करना कि कोई string proper UUID v4 है, लगातार सामने आता है — incoming API request body, URL parameter, webhook payload। hand-rolled regex सही विकल्प है जब आप शून्य dependencies चाहते हैं और केवल v4 वैलिडेट कर रहे हैं। यदि आप पहले से uuid पैकेज उपयोग कर रहे हैं, तो इसके validate() export को प्राथमिकता दें — यह सभी UUID वर्शन handle करता है और custom pattern maintain करने से कम error-prone है। regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i version nibble (जो 4 होना चाहिए) और variant nibble (जो 8, 9, a, या b होना चाहिए) दोनों जाँचता है। boolean check के लिए RegExp.prototype.test() और आसपास के text से UUID extract करने के लिए .match() उपयोग करें।

JavaScript — UUID v4 validation helper
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

function isUUIDv4(str) {
  return UUID_V4_RE.test(str);
}

// Valid UUID v4
console.log(isUUIDv4("9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d")); // true

// UUID v1 — version nibble is 1, not 4
console.log(isUUIDv4("550e8400-e29b-11d4-a716-446655440000")); // false

// UUID v7 — version nibble is 7
console.log(isUUIDv4("018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b")); // false

// Malformed strings
console.log(isUUIDv4("not-a-uuid"));           // false
console.log(isUUIDv4(""));                      // false
console.log(isUUIDv4("9b1deb4d3b7d4bad9bdd2b0d7b3dcb6d")); // false (no hyphens)

// Extract UUID from a larger string
const logLine = 'Request req_id=9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d failed with 503';
const match = logLine.match(/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i);
console.log(match?.[0]);
// "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"

फ़ाइल और API Response से UUID जनरेट और अटैच करें

असल में, आप शायद ही कभी crypto.randomUUID() अकेले कॉल करते हैं। दो pattern लगातार सामने आते हैं: डेटाबेस में लिखने से पहले records को ID assign करना, और outbound API request से correlation ID जोड़ना ताकि आप logs में services के पार request trace कर सकें।

NDJSON फ़ाइल पढ़ें → UUID assign करें → वापस लिखें

Node.js — फ़ाइल से records को UUID assign करें
import { readFileSync, writeFileSync } from 'node:fs';
import { randomUUID } from 'node:crypto';

function assignIds(inputPath, outputPath) {
  const lines = readFileSync(inputPath, 'utf-8')
    .split('\n')
    .filter(line => line.trim());

  const records = lines.map(line => {
    try {
      const record = JSON.parse(line);
      if (!record.id) {
        record.id = randomUUID();
      }
      return JSON.stringify(record);
    } catch (err) {
      console.error(`Skipping malformed line: ${err.message}`);
      return null;
    }
  }).filter(Boolean);

  writeFileSync(outputPath, records.join('\n') + '\n');
  console.log(`Assigned IDs to ${records.length} records → ${outputPath}`);
}

assignIds('warehouse-products.ndjson', 'warehouse-products-with-ids.ndjson');
// Assigned IDs to 1284 records → warehouse-products-with-ids.ndjson

Outbound API Request में Correlation ID जोड़ें

Node.js — distributed tracing के लिए correlation ID
import { randomUUID } from 'node:crypto';

async function createShipment(orderPayload) {
  const correlationId = randomUUID();

  try {
    const response = await fetch('https://api.logistics.dev/v2/shipments', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-Correlation-ID': correlationId,
        'X-Idempotency-Key': randomUUID(),
      },
      body: JSON.stringify(orderPayload),
    });

    if (!response.ok) {
      const errorBody = await response.text();
      throw new Error(`Shipment API returned ${response.status}: ${errorBody}`);
    }

    const result = await response.json();
    console.log(`Shipment created: ${result.shipment_id} (correlation: ${correlationId})`);
    return result;
  } catch (err) {
    console.error(`[correlation:${correlationId}] Shipment failed: ${err.message}`);
    throw err;
  }
}

await createShipment({
  order_id: "ord_8a3f91bc",
  destination: { city: "मुंबई", state: "MH", zip: "400001" },
  items: [{ sku: "WH-7291", quantity: 2, weight_kg: 1.4 }],
});

Command-Line से UUID जनरेट करें

आपको हमेशा script की जरूरत नहीं होती। Node.js command line से सीधे UUID जनरेट कर सकता है, जो shell script, CI pipeline, और quick ad-hoc testing के लिए उपयोगी है। -e flag एक expression evaluate करता है।

bash — command line से UUID जनरेट करें
# Single UUID
node -e "console.log(crypto.randomUUID())"
# 3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f

# Five UUIDs at once
node -e "for(let i=0;i<5;i++) console.log(crypto.randomUUID())"

# Generate and assign to a shell variable
export REQUEST_ID=$(node -e "process.stdout.write(crypto.randomUUID())")
echo "Request ID: $REQUEST_ID"

# Use npx uuid (if you have the package installed globally or want a one-off)
npx uuid v4
# 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed
bash — ब्राउज़र console में UUID जनरेट करें (Node.js के बिना)
# Open any browser DevTools console and type:
crypto.randomUUID()
# "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d"
नोट:यदि आपको CI pipeline में UUID चाहिए और Node.js उपलब्ध नहीं है, uuidgen macOS और अधिकांश Linux distributions पर pre-installed है। यह आधुनिक systems पर डिफ़ॉल्ट रूप से UUID v4 जनरेट करता है।

High-Performance विकल्प — nanoid

यदि आप प्रति सेकंड हजारों ID जनरेट कर रहे हैं और 36-कैरेक्टर UUID format आवश्यक नहीं है, तो nanoid पर विचार करें। यह uuid.v4() से 2x तेज़ है, डिफ़ॉल्ट रूप से 21-कैरेक्टर URL-safe ID बनाता है, और minification के बाद लगभग 1 KB का है। आउटपुट UUID नहीं है — यह custom-alphabet ID है — इसलिए इसे वहाँ उपयोग न करें जहाँ RFC 4122 compliance आवश्यक है (डेटाबेस UUID columns, UUID format validate करने वाले API, OpenTelemetry trace ID)। लेकिन internal correlation ID, React component key, और URL slug के लिए यह उपयुक्त है।

bash — nanoid इंस्टॉल करें
npm install nanoid
JavaScript — छोटे यूनिक ID के लिए nanoid
import { nanoid, customAlphabet } from 'nanoid';

// Default: 21-char URL-safe ID (A-Za-z0-9_-)
const trackingCode = nanoid();
console.log(trackingCode);
// "V1StGXR8_Z5jdHi6B-myT"

// Custom length
const shortCode = nanoid(10);
console.log(shortCode);
// "IRFa-VaY2b"

// Custom alphabet — numbers only, 12 digits
const numericId = customAlphabet('0123456789', 12);
console.log(numericId());
// "839274651023"

// Custom alphabet — hex only, 32 chars (same entropy as UUID v4 without hyphens)
const hexId = customAlphabet('0123456789abcdef', 32);
console.log(hexId());
// "4f8a1b2c3d7e9f0a5b6c8d1e2f3a4b5c"

Syntax Highlighting के साथ Terminal Output

UUID-heavy एप्लिकेशन debug करने का मतलब है terminal में hex string की दीवारें देखना। Color-coding मदद करता है। chalk लाइब्रेरी (या Node.js 21.7+ में नया बिल्ट-इन node:util styleText) आपको log output में UUID को highlight करने देता है ताकि वे आसपास के text से अलग दिखें।

Node.js — chalk के साथ color-coded UUID output
import chalk from 'chalk';
import { randomUUID } from 'node:crypto';

function logEvent(action, metadata = {}) {
  const eventId = randomUUID();
  const timestamp = new Date().toISOString();

  console.log(
    chalk.gray(timestamp),
    chalk.cyan(eventId),
    chalk.white(action),
    Object.keys(metadata).length
      ? chalk.dim(JSON.stringify(metadata))
      : ''
  );
}

logEvent('shipment.created', { order_id: 'ord_8a3f', carrier: 'fedex' });
logEvent('payment.captured', { amount_cents: 14999, currency: 'USD' });
logEvent('webhook.delivered', { endpoint: 'https://hooks.acme.dev/orders' });
// 2026-03-27T10:15:00.000Z  a1b2c3d4-...  shipment.created  {"order_id":"ord_8a3f",...}
चेतावनी:Color escape code log file को corrupt करते हैं और JSON parser को तोड़ते हैं। chalk या styleText केवल terminal output के लिए उपयोग करें जो कोई सीधे पढ़ता है। structured log जो फ़ाइल या log aggregator को जाते हैं, उनके लिए plain JSON उपयोग करें।

JavaScript में छोटे यूनिक ID जनरेट करें

36-कैरेक्टर UUID कभी-कभी बहुत लंबा होता है — URL slug, QR कोड डेटा, SMS message, और embedded hardware protocol सभी में length constraint होती है।

JavaScript — छोटे ID के लिए तीन तकनीकें
import { randomUUID } from 'node:crypto';

// 1. Strip hyphens from UUID v4 → 32-char hex string
const hex32 = randomUUID().replaceAll('-', '');
console.log(hex32);
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f" (32 chars)

// 2. Base64-encode 16 random bytes → 22-char string (URL-safe)
const bytes = new Uint8Array(16);
crypto.getRandomValues(bytes);
const base64Id = Buffer.from(bytes)
  .toString('base64url')
  .replace(/=+$/, '');
console.log(base64Id);
// "Pj8akksNTY6fEnarPIvR" (22 chars, 128 bits of entropy)

// 3. nanoid at custom length
import { nanoid } from 'nanoid';
const short12 = nanoid(12);
console.log(short12);
// "V1StGXR8_Z5j" (12 chars, ~71 bits of entropy)

Collision probability calculation: 12-कैरेक्टर nanoid (64 कैरेक्टर के default alphabet के साथ) लगभग 71 बिट्स entropy देता है। प्रति सेकंड 1,000 ID पर, 1% collision probability तक पहुँचने में लगभग 116 साल लगेंगे। ज़्यादातर applications के लिए यह काफी है। यदि आप प्रतिदिन लाखों ID जनरेट कर रहे हैं, तो full UUID उपयोग करें या कम से कम 21 कैरेक्टर के साथ nanoid उपयोग करें।

UUID v7 — v4 का Time-Ordered विकल्प

UUID v7 (RFC 9562 में परिभाषित) पहले segment में 48-bit Unix millisecond timestamp embed करता है, उसके बाद random bits। परिणाम एक ऐसा UUID है जो v4 जैसा दिखता है लेकिन chronologically sort होता है। यह इसे डेटाबेस primary key के लिए v4 से बेहतर विकल्प बनाता है: नई row हमेशा B-tree index के अंत में जुड़ती है बजाय random positions पर, जो page split और fragmentation को कम करता है। जहाँ मुझे Postgres table के लिए time-ordered ID चाहिए, मैं तुरंत v7 पर switch करता हूँ — index performance अंतर scale पर measurable है। ToolDeck पर UUID v7 Generator किसी भी v7 UUID के लिए embedded timestamp दिखाता है।

JavaScript — uuid पैकेज के साथ UUID v7
import { v7 as uuidv7 } from 'uuid';

// Generate three UUID v7 values — notice they sort chronologically
const id1 = uuidv7();
const id2 = uuidv7();
const id3 = uuidv7();

console.log(id1);
// "018e4a0c-5b3f-7d12-8a9b-0c1d2e3f4a5b"
console.log(id2);
// "018e4a0c-5b40-7e34-9c2d-1e4f5a6b7c8d"
console.log(id3);
// "018e4a0c-5b41-7f56-ae3f-2a5b6c7d8e9f"

// They sort lexicographically by creation time
console.log([id3, id1, id2].sort());
// [id1, id2, id3] — chronological order preserved

// Use v4 for tokens where timing should not be leaked
import { v4 as uuidv4 } from 'uuid';
const sessionToken = uuidv4(); // fully random, no timing info
नोट:uuid पैकेज version 9.0.0 से v7 सपोर्ट करता है। यदि आप पुराने version पर हैं, तो upgrade के लिए npm install uuid@latest चलाएं।

Build Step के बिना ब्राउज़र में UUID v4

कोई bundler नहीं, कोई npm नहीं, कोई transpiler नहीं। बस एक plain HTML file। यह client-side JavaScript में UUID जनरेट करने का सबसे सरल तरीका है। यह इसलिए काम करता है क्योंकि crypto.randomUUID() एक built-in ब्राउज़र API है।

HTML — minimal ब्राउज़र UUID generator
<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><title>UUID Generator</title></head>
<body>
  <p>Your UUID: <strong id="output"></strong></p>
  <button onclick="document.getElementById('output').textContent = crypto.randomUUID()">
    Generate
  </button>
  <script>
    // Generate one on page load
    document.getElementById('output').textContent = crypto.randomUUID();
  </script>
</body>
</html>

बस यही पूरी फ़ाइल है। कोई CDN import नहीं, कोई library pull-in script नहीं। अधिक complex काम के लिए — batch generation, validation, deterministic ID — आपको uuid पैकेज या पहले दिखाया गया manual fallback चाहिए। लेकिन quick prototype या internal tool के लिए, यही सब आपको चाहिए।

सामान्य गलतियाँ

मैंने Math.random() UUID pattern को पुराने blog post से production code में copy होते इतनी बार देखा है जितना मैं स्वीकार करना चाहूँगा। ये pattern जो bugs introduce करते हैं वे silent होते हैं: कोई runtime error नहीं, बस subtly गलत व्यवहार जो बाद में load के तहत या security review में सामने आता है।

UUID जनरेट करने के लिए Math.random() का उपयोग

समस्या: Math.random() क्रिप्टोग्राफिक रूप से सुरक्षित नहीं है। इसका आउटपुट कुछ engines में predictable है, और कम entropy उचित CSPRNG की तुलना में collision की संभावना बहुत अधिक बनाती है।

समाधान: हमेशा crypto.randomUUID() या crypto.getRandomValues() उपयोग करें। दोनों operating system के CSPRNG का उपयोग करते हैं।

Before · JavaScript
After · JavaScript
// INSECURE — predictable, low entropy
function badUuid() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
    /[xy]/g,
    c => {
      const r = Math.random() * 16 | 0;
      return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    }
  );
}
// SECURE — uses the OS CSPRNG
const id = crypto.randomUUID();

// Or if you need a manual fallback:
function secureUuid() {
  const bytes = new Uint8Array(16);
  crypto.getRandomValues(bytes);
  bytes[6] = (bytes[6] & 0x0f) | 0x40;
  bytes[8] = (bytes[8] & 0x3f) | 0x80;
  const h = [...bytes].map(b => b.toString(16).padStart(2, '0'));
  return `${h.slice(0,4).join('')}-${h.slice(4,6).join('')}-${h.slice(6,8).join('')}-${h.slice(8,10).join('')}-${h.slice(10).join('')}`;
}
Case-sensitive equality से UUID की तुलना

समस्या: crypto.randomUUID() lowercase hex लौटाता है, लेकिन अन्य systems (databases, API, user input) से UUID uppercase हो सकते हैं। cases अलग होने पर direct === comparison विफल होती है।

समाधान: तुलना करने से पहले दोनों sides को lowercase में normalize करें।

Before · JavaScript
After · JavaScript
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D"; // uppercase from API
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";  // lowercase from crypto

if (fromApi === local) { /* never runs */ }
const fromApi = "9B1DEB4D-3B7D-4BAD-9BDD-2B0D7B3DCB6D";
const local  = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";

if (fromApi.toLowerCase() === local.toLowerCase()) {
  // matches correctly
}
UUID को string की जगह object में store करना

समस्या: कुछ UUID library (विशेष रूप से अन्य languages में) UUID object लौटाती हैं। JavaScript में, UUID string को object में accidentally wrap करने से equality check, JSON serialization, और database query टूट जाती हैं।

समाधान: UUID को हमेशा plain string के रूप में store और pass करें। यदि कोई library object लौटाती है, तो .toString() कॉल करें या तुरंत string property access करें।

Before · JavaScript
After · JavaScript
// Creating unnecessary wrapper
class UUID {
  constructor(value) { this.value = value; }
}
const id = new UUID(crypto.randomUUID());
console.log(id === id); // true, but...
console.log(JSON.stringify({ id })); // {"id":{"value":"..."}}
// Just use a string
const id = crypto.randomUUID();
console.log(JSON.stringify({ id }));
// {"id":"3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"}
UUID v4 को sortable मानना

समस्या: UUID v4 पूरी तरह रैंडम है। UUID v4 से sort करने पर arbitrary order मिलता है, creation order नहीं। इससे unpredictable pagination, confusing admin UI, और खराब database index performance होती है।

समाधान: जब आपको time-ordered identifier चाहिए तो UUID v7 उपयोग करें। UUID v4 को token और correlation ID के लिए रखें जहाँ sort order अप्रासंगिक है।

Before · JavaScript
After · JavaScript
// Bad: using v4 as a sortable primary key
const rows = [
  { id: crypto.randomUUID(), created: "2026-03-27" },
  { id: crypto.randomUUID(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Sort order is random — NOT by creation date
import { v7 as uuidv7 } from 'uuid';
// Good: v7 sorts by creation time
const rows = [
  { id: uuidv7(), created: "2026-03-27" },
  { id: uuidv7(), created: "2026-03-26" },
];
rows.sort((a, b) => a.id.localeCompare(b.id));
// Sort order matches creation time

crypto.randomUUID() vs uuid vs nanoid — त्वरित तुलना

मेथड
आउटपुट फॉर्मेट
UUID वर्शन
बंडल साइज़
कस्टम टाइप
इंस्टॉल आवश्यक
crypto.randomUUID()
36-char UUID v4
केवल v4
0 KB
N/A
नहीं (बिल्ट-इन)
uuid npm पैकेज
36-char UUID
v1, v3, v4, v5, v6, v7
~6.5 KB
N/A
npm install
nanoid
21-char URL-safe ID
कस्टम (UUID नहीं)
~1 KB
N/A
npm install
Manual getRandomValues
36-char UUID v4
केवल v4
0 KB
N/A
नहीं (बिल्ट-इन)
crypto.randomBytes (Node)
Buffer → 36-char UUID v4
केवल v4
0 KB
N/A
नहीं (Node बिल्ट-इन)
uuidv7 npm पैकेज
36-char UUID v7
केवल v7
~2 KB
N/A
npm install

अधिकांश JavaScript प्रोजेक्ट के लिए: जब आपको केवल UUID v4 चाहिए और आपका runtime पर्याप्त नया है तो crypto.randomUUID() उपयोग करें। जब आपको v5 (deterministic) या v7 (time-ordered) सपोर्ट चाहिए तो uuid पैकेज लें। जब छोटा, URL-safe ID 36-कैरेक्टर UUID से अधिक व्यावहारिक हो तो nanoid उपयोग करें — लेकिन याद रखें कि nanoid आउटपुट UUID-compliant नहीं है और RFC 4122 format की उम्मीद करने वाले किसी भी system पर validation में विफल होगा।

नो-कोड विकल्प के लिए, ब्राउज़र में तुरंत identifier बनाने के लिए UUID v4 Generator आज़माएं। किसी मौजूदा UUID को inspect करने के लिए, उसे UUID Decoder में paste करें और उसका version, variant, और कोई embedded timestamp data देखें।

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

JavaScript में UUID v4 कैसे जनरेट करें?

किसी भी आधुनिक ब्राउज़र (Chrome 92+, Firefox 95+, Safari 15.4+) या Node.js 19+ में crypto.randomUUID() को कॉल करें। यह "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f" जैसी लोअरकेस स्ट्रिंग लौटाता है। ब्राउज़र में कोई import नहीं चाहिए क्योंकि crypto एक बिल्ट-इन ग्लोबल है; Node.js में आप import { randomUUID } from "node:crypto" का उपयोग मॉड्यूल के बारे में स्पष्ट रहने के लिए कर सकते हैं। Node.js 19 से पुराने रनटाइम के लिए, आप ग्लोबल पर crypto.randomUUID() कॉल कर सकते हैं — यह Node.js 14.17.0 से प्रयोगात्मक रूप से उपलब्ध था। यदि आपको नो-कोड विकल्प चाहिए, तो /en/uuid/v4 पर UUID v4 Generator एक क्लिक में RFC-अनुपालक आइडेंटिफायर बनाता है।

JavaScript
const sessionId = crypto.randomUUID();
console.log(sessionId);
// "3e7f1a92-4b0c-4d8e-9f12-7a6b3c8d5e1f"

क्या crypto.randomUUID() क्रिप्टोग्राफिक रूप से सुरक्षित है?

हाँ। crypto.randomUUID() उसी CSPRNG (cryptographically secure pseudorandom number generator) का उपयोग करता है जो crypto.getRandomValues() को सपोर्ट करता है। UUID v4 में 122 रैंडम बिट्स होते हैं जिससे टकराव की संभावना नगण्य है — आपको 50% टकराव संभावना तक पहुँचने के लिए लगभग 2.71 क्विंटिलियन UUID जनरेट करने होंगे। एंट्रॉपी ऑपरेटिंग सिस्टम के रैंडम स्रोत (Linux पर /dev/urandom, Windows पर BCryptGenRandom) से आती है, Math.random() से नहीं, जो स्पष्ट रूप से क्रिप्टोग्राफिक रूप से सुरक्षित नहीं है। इसका मतलब है कि UUID v4 मान सेशन टोकन, CSRF टोकन और अन्य सुरक्षा-संवेदनशील आइडेंटिफायर के रूप में उपयोग के लिए सुरक्षित हैं। सुरक्षा संदर्भों में Math.random()-आधारित UUID जनरेटर कभी न बदलें।

क्या UUID v4 को डेटाबेस प्राइमरी की के रूप में उपयोग कर सकते हैं?

आप कर सकते हैं, लेकिन एक महत्वपूर्ण परफॉर्मेंस ट्रेड-ऑफ है। UUID v4 पूरी तरह रैंडम है, इसलिए B-tree इंडेक्स खराब तरीके से विखंडित हो जाते हैं क्योंकि प्रत्येक नई row इंडेक्स में एक रैंडम पोजीशन पर डाली जाती है न कि अंत में। write-heavy टेबल पर यह अत्यधिक पेज स्प्लिट और कैश मिस का कारण बनता है, जो INSERT और range-scan परफॉर्मेंस को खराब करता है। यदि आपका डेटाबेस इसे सपोर्ट करता है (PostgreSQL, MySQL 8.0+, SQL Server), तो UUID v7 (time-ordered) एक बेहतर प्राइमरी की है क्योंकि नई row हमेशा इंडेक्स के अंत में जुड़ती है। UUID v4 सेशन टोकन, OAuth state पैरामीटर, idempotency key, correlation ID और किसी भी फ़ील्ड के लिए सही विकल्प है जहाँ creation time छिपाना वांछनीय है।

JavaScript
// UUID v4 — random, not sortable
const correlationId = crypto.randomUUID();

// UUID v7 — time-ordered, better for DB primary keys
import { v7 as uuidv7 } from 'uuid';
const rowId = uuidv7();

UUID v4 और UUID v7 में क्या अंतर है?

UUID v4 122 बिट्स को रैंडम डेटा से भरता है — हर सेगमेंट प्रभावी रूप से नॉइज़ है। UUID v7 (RFC 9562, 2024 में प्रकाशित) पहले सेगमेंट में 48-bit Unix मिलीसेकंड टाइमस्टैम्प, दूसरे सेगमेंट में 12 बिट सब-मिलीसेकंड प्रिसीजन और बाकी में रैंडम बिट्स एन्कोड करता है। दोनों कुल 128 बिट हैं और एक ही 36-कैरेक्टर हाइफ़नेटेड फॉर्मेट उपयोग करते हैं, इसलिए स्टोरेज लेयर पर वे इंटरचेंजेबल हैं। UUID v7 creation time के अनुसार lexicographically sortable है, जो B-tree इंडेक्स को कॉम्पैक्ट रखता है और time window पर range query को कुशल बनाता है। UUID v4 तब चुनें जब ID को यह नहीं बताना चाहिए कि यह कब बनाई गई थी — उदाहरण के लिए, public-facing टोकन जहाँ timing जानकारी का दुरुपयोग हो सकता है — और UUID v7 डेटाबेस प्राइमरी key, audit log और event stream के लिए जहाँ कालानुक्रमिक क्रम महत्वपूर्ण है।

JavaScript में UUID v4 स्ट्रिंग को कैसे वैलिडेट करें?

regex /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i के विरुद्ध परीक्षण करें। पोजीशन 15 (0-indexed) पर literal "4" वर्शन निबल की पुष्टि करता है; पोजीशन 20 पर कैरेक्टर — 8, 9, a, या b में से एक — RFC 4122 वेरिएंट बिट्स को एन्कोड करता है। यह regex UUID v1, v7 और किसी भी malformed स्ट्रिंग को सही तरीके से रिजेक्ट करता है। i फ्लैग इसे case-insensitive बनाता है, इसलिए दूसरे सिस्टम से uppercase hex अंक बिना normalization के validation पास करते हैं। यदि आपको केवल यह जानना है कि क्या स्ट्रिंग किसी भी वैध UUID (वर्शन की परवाह किए बिना) है, तो ढीले पैटर्न /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i का उपयोग करें।

JavaScript
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;

UUID_V4_RE.test("550e8400-e29b-41d4-a716-446655440000"); // true
UUID_V4_RE.test("550e8400-e29b-11d4-a716-446655440000"); // false (v1)
UUID_V4_RE.test("not-a-uuid"); // false

JavaScript में छोटा यूनिक ID कैसे जनरेट करें?

UUID v4 से हाइफ़न हटाकर 32-कैरेक्टर हेक्स स्ट्रिंग बनाएं: crypto.randomUUID().replaceAll("-", "")। और भी छोटे के लिए, nanoid उपयोग करें जो डिफ़ॉल्ट रूप से 21-कैरेक्टर URL-safe ID (A–Z, a–z, 0–9, _ और -) बनाता है और full UUID जितना ही collision resistance रखता है। ट्रेड-ऑफ सीधा है: छोटे ID में collision संभावना अधिक होती है, लेकिन 21 कैरेक्टर nanoid फिर भी 126 बिट एंट्रॉपी देता है जो लगभग हर real-world एप्लिकेशन के लिए पर्याप्त है। URL slug और QR कोड पेलोड के लिए nanoid के साथ 10–12 कैरेक्टर तक जा सकते हैं, इससे पहले कि विशिष्ट जनरेशन दरों पर collision संभावना चिंता का विषय बने। raw UUID को Base64-encode करके truncate न करें — truncation बिट्स की statistical independence को नष्ट करता है और collision को reason करना कठिन बनाता है।

JavaScript
// 32-char hex string from UUID v4
const hexId = crypto.randomUUID().replaceAll('-', '');
// "3e7f1a924b0c4d8e9f127a6b3c8d5e1f"

// 21-char URL-safe ID via nanoid
import { nanoid } from 'nanoid';
const shortId = nanoid();
// "V1StGXR8_Z5jdHi6B-myT"

संबंधित टूल

इसमें भी उपलब्ध:Python
SL
Sophie LaurentTypeScript & Full-stack Developer

Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.

MW
Marcus Webbतकनीकी समीक्षक

Marcus specialises in JavaScript performance, build tooling, and the inner workings of the V8 engine. He has spent years profiling and optimising React applications, working on bundler configurations, and squeezing every millisecond out of critical rendering paths. He writes about Core Web Vitals, JavaScript memory management, and the tools developers reach for when performance really matters.