क्रमबद्ध, 26-वर्ण ULID (Crockford base32) उत्पन्न करें और एम्बेडेड टाइमस्टैम्प को वापस तारीख़ में डिकोड करें। डेटाबेस प्राइमरी कुंजियों के लिए बढ़िया।
क्रमबद्ध अद्वितीय पहचानकर्ता। एक ULID 26 वर्णों का होता है: पहले 10 मिलीसेकंड में निर्माण समय को एनकोड करते हैं, अंतिम 16 यादृच्छिक होते हैं। इससे वे शाब्दिक रूप से क्रमबद्ध (lexicographically sortable) और कुंजियों के रूप में उपयोग करने के लिए सुरक्षित बनते हैं। आपके ब्राउज़र में उत्पन्न।
टाइमस्टैम्प:
अमान्य ULID
ULID बनाम UUID
ULID क्या है
एक ULID 128-बिट पहचानकर्ता है, जो UUID के समान चौड़ाई है, दो भागों में विभाजित: एक 48-बिट मिलीसेकंड टाइमस्टैम्प जिसके बाद 80 यादृच्छिक बिट्स आते हैं। इसे 36-वर्ण वाले हाइफ़नयुक्त हेक्स UUID के बजाय Crockford base32 के 26 वर्णों के रूप में रेंडर किया जाता है, इसलिए यह छोटा, केस-असंवेदनशील है और उन वर्णों से मुक्त है जो सबसे आसानी से गलत पढ़े जाते हैं — I, L, O और U सभी वर्णमाला से बाहर रखे जाते हैं।
निष्कर्षणहीन अंतर एनकोडिंग नहीं, बल्कि क्रमबद्धता है। चूँकि टाइमस्टैम्प उच्च बिट्स पर काबिज़ होता है और base32 बाइट क्रम को संरक्षित करता है, ULID को सादी स्ट्रिंग्स के रूप में क्रमबद्ध करने से वे निर्माण समय से क्रमबद्ध होते हैं। एक ही मिलीसेकंड में उत्पन्न दो ID उनके यादृच्छिक घटक पर वापस आते हैं, लेकिन मिलीसेकंड्स के पार क्रम सटीक होता है।
डेटाबेस के लिए क्रमबद्धता क्यों मायने रखती है
UUIDv4 समान रूप से यादृच्छिक है, जो क्लस्टर्ड इंडेक्स में आपको चाहिए ही नहीं वह चीज़ है। हर सम्मिलन B-ट्री में एक यादृच्छिक बिंदु पर आता है, इसलिए डेटाबेस लगातार पेजेस को विभाजित करता है और ठंडे पेजेस को छूता है। इंडेक्स को अपनी आवश्यकता से बड़ा होना पड़ता है और लिखने की थ्रूपुट तालिका बढ़ने के साथ गिरती है। MySQL के InnoDB और SQL Server में UUID प्राइमरी कुंजियों की यह एक अच्छी तरह से दस्तावेज़ीकृत समस्या है।
एक समय-क्रमबद्ध पहचानकर्ता इंडेक्स के दाईं ओर के किनारे के पास जुड़ता है, जो ऑटो-इंक्रीमेंट पूर्णांक के समान एक्सेस पैटर्न है। आपको क्लाइंट-जनित वैश्विक रूप से अद्वितीय कुंजी के लाभ बने रहते हैं — बिना ID प्राप्त करने के लिए कोई राउंड ट्रिप, सेवाओं के बीच कोई समन्वय, शार्ड्स के पार सुरक्षित मर्ज — बिना इंडेक्स विखंडन के।
कब कुछ और उपयोग करें
UUIDv7, जिसे RFC 9562 में मानकीकृत किया गया है, मानक UUID प्रारूप और लेआउट में ULID के समान ही काम करता है। यदि आपका स्टैक पहले से ही नेटिव UUID कॉलम प्रकार और टूलिंग रखता है, तो UUIDv7 अब आम तौर पर बेहतर विकल्प है केवल इसलिए क्योंकि यह मौजूदा पारिस्थितिकी तंत्र में खुद ब खुद बैठ जाता है। ULID तब भी आकर्षक रहता है जब आप URL या लॉग्स में छोटा, अधिक मित्रवत टेक्स्ट रूप चाहते हैं।
बहरहाल, स्पष्ट रहें कि टाइमस्टैम्प उस ID को रखने वाले किसी भी व्यक्ति के लिए दृश्यमान है। निर्माण समय लीक होते हैं, और आसन्न ID क्रम को उजागर करते हैं — इन्हें उन चीज़ों के लिए न उपयोग करें जहाँ गणना या समय संवेदनशील हो। और प्रति मिलीसेकंड 80 यादृच्छिक बिट्स के साथ, टकराव एक व्यावहारिक चिंता नहीं है, लेकिन ULID रहस्य नहीं हैं और उन्हें कभी क्षमता टोकन (capability tokens) के रूप में उपयोग नहीं किया जाना चाहिए।
FAQ
ULID UUID से कैसे भिन्न है?
दोनों 128 बिट्स के हैं, लेकिन एक ULID 48-बिट मिलीसेकंड टाइमस्टैम्प को पहले रखता है, इसलिए स्ट्रिंग्स को क्रमबद्ध करने से वे निर्माण समय से क्रमबद्ध होते हैं। UUIDv4 पूरी तरह यादृच्छिक है और मनमर्ज़ी से क्रमबद्ध होता है।
डेटाबेस के लिए क्रमबद्धता क्यों मायने रखती है?
यादृच्छिक प्राइमरी कुंजियाँ B-ट्री में सम्मिलनों को बिखेर देती हैं और इंडेक्स को विखंडित करती हैं। समय-क्रमबद्ध कुंजियाँ अंत के पास जुड़ती हैं, जिससे लेखन अनुक्रमिक रहता है और गर्म पेजेस छोटे रहते हैं।
क्या एक ही मिलीसेकंड में बनाए गए ID भी क्रमबद्ध रहते हैं?
मोनोटोनिक मोड में, हाँ। यादृच्छिक भाग को फिर से खींचने के बजाय उपकरण इसे बढ़ा देता है, इसलिए एक ही मिलीसेकंड में उत्पन्न कई ID भी क्रम में बने रहते हैं।
क्या किसी ULID को सार्वजनिक रूप से उजागर करना सुरक्षित है?
यादृच्छिक आधा अनुमान लगाने योग्य नहीं है, लेकिन टाइमस्टैम्प किसी भी व्यक्ति द्वारा पठनीय है। यदि किसी रिकॉर्ड का निर्माण समय संवेदनशील है, तो उसके सार्वजनिक पहचानकर्ता के रूप में ULID का उपयोग न करें।
क्या मुझे ULID या UUIDv7 चुनना चाहिए?
वे एक ही समस्या को हल करते हैं। UUIDv7 को RFC 9562 में मानकीकृत किया गया है और मौजूदा UUID कॉलम और लाइब्रेरीज़ में फिट होता है, इसलिए नए काम के लिए इसे प्राथमिकता दें जब तक कि आप विशेष रूप से 26-वर्ण Crockford रूप नहीं चाहते।
26 वर्ण क्यों?
Crockford Base32 में 128 बिट्स को एनकोड करने के लिए 26 प्रतीकों की आवश्यकता होती है। वर्णमाला I, L, O और U को बहिष्कृत करती है ताकि ट्रांसक्रिप्शन गलतियाँ और अनायास शब्दों से बचा जा सके।