GH GambleHub

आईडी बनाया जा रहा है

1) पहचानकर्ताओं पर ध्यान क्यों दें

पहचानकर्ता (आईडी) - इकाई की मौलिक कुंजी: डेटाबेस लाइनें, संदेश, फ़ाइल, क्रम। इसके गुण इस पर निर्भर करते हैं:
  • विशिष्टता और पैमाने (टकराव, क्षैतिज विकास)।
  • आदेश और छंटाई (समय सहसंबंध, प्रतिकृति, डीडप)।
  • भंडारण प्रदर्शन (सूचकांक, गर्म पृष्ठ, कुंजी आकार)।
  • सुरक्षा (अप्रत्याशितता, लीक, अनुमान लगाना)।
  • प्रयोज्यता/एकीकरण (लघु, URL-सुरक्षित, मामला संवेदनशील नहीं).

आईडी चुनना एन्ट्रापी, ऑर्डरबिलिटी, लंबाई, पीढ़ी दर और शोषण के बीच एक समझौता है।

2) प्रमुख आवश्यकताएं और शर्तें

विशिष्टता: टक्कर की संभावना स्वीकार्य जोखिम से कम होनी चाहिए।

एन्ट्रापी: "कितना यादृच्छिकता" में आईडी (बिट) होता है।

टाइम-सॉर्टेबल/के-सॉर्टेबल-लेक्सोग्राफिक - टाइम-आधारित सॉर्टिंग।

एकरसता: एक नोड/धारा के भीतर एक गैर-घटता अनुक्रम।

प्रवेश की स्थानीयता: सूचकांक की "पूंछ" (गर्म पृष्ठों का खतरा) में कितना नया सम्मिलित है।

भविष्यवाणी: क्या पड़ोसी आईडी (सुरक्षा/एपीआई के लिए महत्वपूर्ण) का अनुमान लगाना संभव है।

प्रतिनिधित्व: द्विआधारी/स्ट्रिंग, hyphens, मामला।

3) प्रमुख पहचानकर्ता परिवार

3. 1 यूयूआईडी

v4 (यादृच्छिक): एन्ट्रापी के 122 बिट्स। अव्यवस्थित, सुरक्षा और सादगी के लिए अच्छा। माइनस: यादृच्छिक वितरण के कारण "अराजक" सूचकांक - जो समान रूप से भार को फैलाता है और "गर्म पृष्ठों" को हटा देता है।

v1 (समय + मैक): व्यवस्था करें, लेकिन मैक/समय (गोपनीयता) वहन करता है; अक्सर टाला जाता है।

v7 (टाइम-ऑर्डर): मिलीसेकंड टाइम + रैंडम पार्ट। डेटाबेस में समय और अच्छे संपीड़न द्वारा लेक्सोग्राफिक सॉर्टिंग के लिए डिज़ाइन। समझौता: सूचकांक की "गर्म पूंछ" दिखाई देती है; shardining/उपसर्ग/वृद्धि द्वारा उपचारित।

युक्तियाँ

बाहरी एपीआई और लैक्स ऑर्डर आवश्यकताओं के लिए - v4।

घटना/लॉग डेटाबेस और "सॉर्ट" कुंजी - v7 के लिए।

3. 2 ULID (क्रॉकफोर्ड Base32)

128 बिट्स: 48 बिट्स समय (ms) + 80 बिट्स यादृच्छिकता। लेक्सिकोग्राफिक रूप से समय के अनुकूल, मानव-अनुकूल ('I, L, O, U' के बिना), URL-सुरक्षित। एक मोनोटोन भिन्नता है (एक ही समय स्टांप के साथ, यादृच्छिक भाग बढ़ ता है)।

पेशेवरों: पढ़ाई, व्यवस्थितता, पोर्टेबिलिटी।

विपक्ष: एक समय में आवेषण की बहुत अधिक आवृत्ति के साथ - "गर्म पूंछ।"

3. 3 केएसयूआईडी

160 बिट्स: 32 बिट्स ऑफ टाइम (सेकंड) युग + 128 बिट्स के यादृच्छिकता के सापेक्ष। बड़ी समय सीमा और स्थिर छंटाई, तार ULID से कम? (नहीं - अब, लेकिन अपने स्वयं के एन्कोडिंग के साथ), वितरित लॉग और वस्तुओं के लिए अच्छा है।

3. 4 स्नोफ्लेक जैसे (के-सॉर्टेबल फ्लेक आईडी)

क्लासिक स्कीमा (कस्टम):

[ timestamp bits ][ region/datacenter bits ][ worker bits ][ sequence bits ]

गुण: नोड, अर्ध-वैश्विक विशिष्टता, लघु (64 बिट) द्विआधारी प्रतिनिधित्व पर मोनोटोन वृद्धि।

जोखिम: घड़ी निर्भरता (समय बहाव/प्रतिगमन), एक टिक में अनुक्रम की थकावट, क्षेत्र/कार्यकर्ता बिट्स का समन्वय।

उपचारित: "घड़ीवापस", आरक्षित अनुक्रम, समय डिटेक्टर, पीटीपी/एनटीपी अनुशासन के खिलाफ सुरक्षा।

3. 5 डीबी अनुक्रम (अनुक्रम/पहचान)

एक DBMS/शार्ड में सबसे सरल मोनोटोन पीढ़ी।

पेशेवरों: स्थानीय तालिकाओं के लिए छोटा, तेज, सुविधाजनक।

विपक्ष: एक वितरित क्लस्टर में विश्व स्तर पर मुश्किल; पूर्वानुमानित (एक सार्वजनिक कुंजी के रूप में असुरक्षित), सूचकांक की एक गर्म पूंछ बनाता है।

3. 6 सामग्री-पता आईडी (हैश सामग्री)

सामग्री SHA-256/Blake3 → स्थिर आईडी, डीडुप्लीकेशन, इंटीग्रिटी चेकिंग, कैशिंग।

पेशेवरों: नियतावाद, प्रतिस्थापन के खिलाफ सुरक्षा।

विपक्ष: महंगी पीढ़ी (सीपीयू), टकराव व्यावहारिक शून्य हैं, कोई समय छंटाई नहीं, लंबाई।

4) टकराव और "जन्मदिन विरोधाभास" (सहज ज्ञान युक्त)

'एन' पीढ़ियों में आकार 'बी' बिट्स के यादृच्छिक आईडी के लिए टकराव की संभावना लगभग है:

p ≈ 1 - exp (-n (n-1 )/2/2 ^ b) ≈ n ^ 2/2 ^ (b + 1) (for small p)
उदाहरण:
  • UUIDv4 (122 बिट्स) n = 10 ^ 12 (ट्रिलियन) → p ~ 1e-14 (नगण्य) पर।
  • 64-बिट यादृच्छिक - n = 10 ^ 9 पहले से ही p ~ 0 के साथ। 027 (उल्लेखनीय जोखिम)।
  • निष्कर्ष: 64-बिट यादृच्छिक अक्सर विशाल प्रणालियों के लिए पर्याप्त नहीं होता है; 96/128 बिट्स का उपयोग करें।

5) सूचकांक, गर्म पृष्ठ और भंडारण

यादृच्छिक कुंजियाँ (v4) समान रूप से सूचकांक के पेड़ पर आवेषण वितरित करती हैं - कोई "पूंछ" नहीं है, लेकिन कैश इलाका बदतर है।

टाइम-सॉर्टेड ( ) को "पूंछ में" डाला जाता है - बेहतर इलाके और संपीड़न, लेकिन उच्च समानांतर रिकॉर्डिंग के तहत गर्म पृष्ठों का जोखिम।

गर्म पूंछ शमन:
  • किरायेदार/क्षेत्र द्वारा उपसर्ग/शार्टिंग (समय से पहले 1-2 बाइट्स जोड़ें);
  • इंटरलेविंग: उच्च बिट्स में यादृच्छिकता का हिस्सा;
  • बैच आवेषण, बी-ट्री में भराव, बड़े लॉग के लिए ब्रिन/क्लस्टरिंग के लिए ऑटो-संक्रमण।
आकार महत्वपूर्ण है:
  • 'UUID (16B)' बनाम 'BIGINT (8B) '/' INT8' saves मेमोरी/कैश; Base32/58/64 पंक्तियों का आकार 20-60% बढ़ जाता है। डेटाबेस के लिए, बाइनरी स्टोर करें, किनारे पर एक स्ट्रिंग को क्रमबद्ध करें।

6) सुरक्षा और गोपनीयता

URL/API में सार्वजनिक आईडी के रूप में SEQUENCE/INT का उपयोग न करें: संसाधनों की अनुमानित → गणना।

बाहरी संदर्भों के लिए यादृच्छिक, अप्रत्याशित आईडी (v4/v7/ULID/KSUID) जोड़ें।

पीआईआई को आईडी में एनकोड न करें। यदि आप विशेषता सक्षम करना चाहते हैं, एनक्रिप्ट/साइन (उदाहरण के लिए, JWE/JWS) या अपारदर्शी टोकन का उपयोग करें।

URL-सुरक्षित एन्कोडिंग: Base32 क्रॉकफोर्ड, Base58 ('0OIl' के बिना), Base64url।

7) बहु-किरायेदारी, उपसर्ग और मार्ग

प्रारूप: '[किरायेदार _ PREFIX] - [ID]' या द्विआधारी: 'किरायेदार _ id id'।

पेशेवरों: त्वरित फिल्टर/किरायेदार पार्टियां, एन + 1 स्कैन के खिलाफ सुरक्षा।

विपक्ष: उच्च बिट्स में एन्ट्रापी घनत्व खराब हो सकता है - वितरण (उपसर्ग हैश) पर विचार करें।

हैश प्रत्यय (2-3 बाइट्स) टकराव को कम करता है और शार्ड रूटिंग में मदद करता है: 'शार्ड = हैश (आईडी)% एन'।

8) चयन के लिए व्यावहारिक सिफारिशें

एपीआई, सार्वजनिक लिंक, सख्त आदेश के बिना वितरित सेवाएं: UUIDv4, ULID/KSUID।

लॉग/इवेंट/ऑर्डर, जहां हम अक्सर समय पर सॉर्ट करते हैं: UUIDv7 या ULID (मोनोटोन)।

स्थानीय एकरसता और लघु कुंजी के साथ अल्ट्रा-हाई बैंडविड्थ: स्नोफ्लेक जैसे 64-बिट (समय अनुशासन की आवश्यकता)।

कलाकृतियों/बिल्ड/ब्लॉब्स के वाल्ट्स: सामग्री-पता (SHA-256), और शीर्ष पर - एक मानव-अनुकूल लघु "शोकेस" (हैशिड्स/लिंक)।

एक डेटाबेस में स्थानीय तालिकाएँ: सार्वजनिक लिंक (मास्किंग) के लिए अनुक्रम/पहचान + बाहरी "रैपर"।

9) कार्यान्वयन और उदाहरण

9. 1 PostgreSQL

UUID बाइनरी, इंडेक्स - 'btree' या 'हैश' को आवश्यकतानुसार संग्रहीत करें।

sql
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE orders (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(), -- или uuid_generate_v4()
created_at timestamptz NOT NULL DEFAULT now(),
tenant smallint NOT NULL
);

-- For time-sortable (UUIDv7) store binary (uuid), generation in the application.
-- If you want a cluster by time:
CREATE INDEX ON orders (created_at DESC);
अनुक्रमिक गर्म फिक्स: समय-क्रमबद्ध आईडी के लिए, ऊपरी बिट्स में "नमक" जोड़ें या किरायेदार द्वारा स्कोर करें:
sql
CREATE TABLE orders_t1 PARTITION OF orders FOR VALUES IN (1);
CREATE TABLE orders_t2 PARTITION OF orders FOR VALUES IN (2);

9. 2 रेडिस (परमाणु काउंटर/मोनुटोनिया)

bash
INCR "seq: orders" # local sequence combine: epoch_ms<<20     (worker_id<<10)      (seq & 1023)

9. 3 स्नोफ्लेक जैसा जनरेटर (स्यूडोकोड)

pseudo const EPOCH =  1704067200000  # custom epoch (ms)
state: last_ms=0, seq=0, worker=7, region=3

next():
now = epoch_ms()
if now < last_ms: wait_until(last_ms)    # защита от clock back if now == last_ms:
seq = (seq + 1) & ((1<<12)-1)      # 12 бит if seq == 0: wait_next_ms()
else:
seq = 0 last_ms = now return (now-EPOCH)<<22      region<<17      worker<<12      seq

9. अनुप्रयोगों में 4 ULID/UUID

जाओ

go
// ULID t:= time. Now(). UTC()
entropy:= ulid. Monotonic(rand. New(rand. NewSource(t. UnixNano())), 0)
id:= ulid. MustNew(ulid. Timestamp(t), entropy)

//UUID v7 (if there is a library)
id:= uuid. Must(uuid. NewV7())

नोड। जेएस

js import { ulid } from 'ulid';
import { v4 as uuidv4 } from 'uuid';
const id1 = ulid();
const id2 = uuidv4(); // v4

पायथन

python import uuid, time id_v4 = uuid. uuid4()
For v7, use a library (for example, uuid6/7 third-party packages)

10) एन्कोडिंग और अभ्यावेदन

डेटाबेस में द्विआधारी ('BYTEA', 'UUID') → कॉम्पैक्ट और तेज़। किनारे पर, में परिवर्तित करें:
  • Base32 क्रॉकफोर्ड (ULID): मामला असंवेदनशील, कोई नेत्रहीन समान वर्ण नहीं।
  • : मानव-पढ़ने योग्य टोकन के लिए संक्षेप में, URL-सुरक्षित।
  • Base64url: URL में संक्षिप्त, लेकिन '-' और' _ '।

स्ट्रिंग्स की तुलना करते समय डुप्लिकेट से बचने के लिए केस और प्रारूप (हाइफ़न्स/कोई नहीं) स्थिर करें।

11) टेस्ट प्लेबुक और अवलोकन

टकराव: मीट्रिक 'id _ collision _ total' (0 होना चाहिए), सतर्क> 0।

उपसर्ग वितरण: उच्च बाइट्स के हिस्टोग्राम - हम खरीदने की तलाश कर रहे हैं।

जनरेशन दर: 'ids _ per _ sec', p99 जनरेटर विलंबता।

घड़ी तिरछा (स्नोफ्लेक के लिए): ऑफसेट नोड्स, "घड़ीवापस चली गई" घटनाएं।

सूचकांक पूंछ: p95/p99 'INSERT' विलंबता; ताले/गर्म पृष्ठों का अनुपात।

खेल दिवस:
  • इंजेक्शन "घड़ीबहाव/वापस" - सुनिश्चित करें कि जनरेटर प्रतीक्षा/स्विचिंग है।
  • मिलीसेकंड में 'अनुक्रम' ओवरफ्लो → next_ms वेटिंग चेक।
  • मास समानतावाद - चाहे सूचकांक में ताले के तूफान हों।

12) एंटी-पैटर्न

AUTO_INCREMENT/SEQUENCE एक सार्वजनिक आईडी के रूप में: अनुमान लगाया, लीक। एक आंतरिक पर एक सार्वजनिक अपारदर्शी आईडी का उपयोग करें।

UUIDv1 (मैक/समय) बाहर: गोपनीयता।

64-बिट रैंडम आईडी प्रति ट्रिलियन प्रविष्टियाँ: टकराव का वास्तविक जोखिम।

एचए के बिना वैश्विक "केंद्रीय जनरेटर": एसपीओएफ और अड़ चन।

घड़ी वापस सुरक्षा के बिना समय-क्रमबद्ध आईडी: डुप्लिकेट्स/ऑर्डर का प्रतिगमन।

बहस/प्रवासन में एक स्पष्ट संस्करण/उपसर्ग - अराजकता के बिना विभिन्न आईडी प्रारूपों को मिलाना।

विभिन्न रजिस्टरों/फॉर्मों के साथ स्ट्रिंग के रूप में ID सहेजना → छुपा डुप्लिकेट।

13) कार्यान्वयन चेकलिस्ट

  • डोमेन आवश्यकताओं के लिए चयनित प्रारूप (v4/v7/ULID/KSUID/Snowflake/SEQ/hash)।
  • परिभाषित आदेश आवश्यकताएं (क्या छंटनी आवश्यक है)।
  • टकराव की संभावना (बी बिट्स, एन पीढ़ी) अनुमानित है और जोखिम सीमा निर्धारित है।
  • एन्कोडिंग डिजाइन किया गया है (डीबी + मानव-पढ़ने योग्य शोकेस में द्विआधारी)।
  • समय-क्रमबद्ध के लिए - घड़ी वापस सुरक्षा, अनुक्रम सीमा और एनटीपी/पीटीपी अनुशासन।
  • सार्वजनिक आईडी के लिए - अप्रत्याशितता (यादृच्छिक/यूएलआईडी/केएसयूआईडी), पीआईआई की अनुपस्थिति।
  • हैश आउट (आईडी)% N, मल्टी-किरायेदार उपसर्ग।
  • अवलोकन: टकराव, वितरण, विलंबता, घड़ी तिरछा मेट्रिक्स।
  • अनुक्रम/विवाद/विंडो लंबाई अतिप्रवाह परीक्षण मामले।
  • प्रारूप, संस्करण, युग, बिटमैप और प्रवासन योजना प्रलेखन।

14) एफएक्यू

प्रश्नः माइक्रोसर्विस के लिए "डिफ़ॉल्ट" क्या चुनें?

A: UUIDv7 या ULID: समय आदेश देना, किनारे पर बहुत सारी एन्ट्रापी, सरल पीढ़ी। बाहरी एपीआई के लिए, ULID/UUIDv4 भी लगभग है।

प्रश्न: एक छोटी और मानव-पढ़ने योग्य आईडी की आवश्यकता है।

A: ULID/KSUID या Base58-128-bit रैंडम/अस्थायी ID एन्कोडिंग। लंबाई और टकराव के बारे में याद रखें।

प्रश्न: क्या "लघु संख्यात्मक" आईडी बनाना संभव है, लेकिन सुरक्षित है?

A: हाँ: आंतरिक SEQ को संग्रहीत करें, और बाहर नमक + हस्ताक्षर के साथ अपारदर्शी टोकन (यादृच्छिक 96-128 बिट्स) या हैशिड्स दें।

प्रश्न: मैं SEQ से UUIDv7 में कैसे पलायन करूं?

A: एक नया स्तंभ 'id _ नई' (UUID) दर्ज करें, दो-ट्रैक, नई आईडी के संदर्भ प्रकाशित करें, फिर डीसी/विदेशी कुंजी स्विच करें और पुराने को हटा दें।

प्रश्न: मेरे ULID आवेषण को "गर्म" क्यों मिला?

A: एक सूचकांक में कड़ाई से बढ़ ती कुंजी डालें। विभाजन/किरायेदार, उच्च-क्रम बिट्स मिलाएं, बैच आवेषण का उपयोग करें।

15) कुल

एक अच्छी आईडी समस्या के लिए गुणों का सही सेट है: पर्याप्त एन्ट्रापी, पूर्वानुमानित छंटाई (यदि आवश्यक हो), सुरक्षित प्रचार और सूचकांकों का स्वस्थ शोषण। सादगी और वितरण के लिए UUIDv4/ULID/UUIDv7/KSUID चुनें, घनी एकरसता और छोटी कुंजियों के लिए स्नोफ्लेक (समय अनुशासन के लिए), स्थानीय तालिकाओं के लिए अनुक्रम, कलाकृतियों के लिए सामग्री हैश। अवलोकन और परीक्षण बिछाएं - और पहचानकर्ता आश्चर्य का स्रोत बने रहेंगे।

Contact

हमसे संपर्क करें

किसी भी प्रश्न या सहायता के लिए हमसे संपर्क करें।हम हमेशा मदद के लिए तैयार हैं!

Telegram
@Gamble_GC
इंटीग्रेशन शुरू करें

Email — अनिवार्य है। Telegram या WhatsApp — वैकल्पिक हैं।

आपका नाम वैकल्पिक
Email वैकल्पिक
विषय वैकल्पिक
संदेश वैकल्पिक
Telegram वैकल्पिक
@
अगर आप Telegram डालते हैं — तो हम Email के साथ-साथ वहीं भी जवाब देंगे।
WhatsApp वैकल्पिक
फॉर्मैट: देश कोड और नंबर (उदा. +91XXXXXXXXXX)।

बटन दबाकर आप अपने डेटा की प्रोसेसिंग के लिए सहमति देते हैं।