GUID / UUID कैसे बनाएं?


4172

मैं जावास्क्रिप्ट में विश्व स्तर पर विशिष्ट पहचानकर्ता बनाने की कोशिश कर रहा हूं। मुझे यकीन नहीं है कि सभी ब्राउज़रों पर कौन सी रूटीन उपलब्ध हैं, "यादृच्छिक" और अंतर्निहित रैंडम संख्या जनरेटर को कैसे वरीयता दी जाती है, आदि।

GUID / UUID में कम से कम 32 अक्षर होने चाहिए और आस-पास से गुजरने पर परेशानी से बचने के लिए ASCII रेंज में रहना चाहिए।


13
GUIDs जब स्ट्रिंग के रूप में दोहराए जाते हैं तो कम से कम 36 और लंबाई में 38 से अधिक वर्ण नहीं होते हैं और पैटर्न से मेल खाते हैं ^ \ {? [A-zA-Z0-9] {36}? \} $ और इसलिए हमेशा ascii होते हैं।
एंथोनीवजोन

2
पर डेविड Bau एक बेहतर, seedable यादृच्छिक संख्या जनरेटर प्रदान करता है davidbau.com/archives/2010/01/30/... मैं कम से UUIDs पैदा करने के लिए एक अलग दृष्टिकोण लिखा blogs.cozi.com/tech/2010/04/generating- uuids-in-javascript.html
जॉर्ज वी। रेली

अजीब है कि किसी ने अभी तक इसका उल्लेख नहीं किया है, लेकिन पूर्णता के लिए, एनपीएम पर गाइड जनरेटर के ढेर सारे हैं मैं उनमें से ज्यादातर को ब्राउज़र में भी काम करने के लिए तैयार हूं।
जॉर्ज मौएर

जवाबों:


2335

RFC 4122 के अनुसार UUIDs (यूनिवर्सली यूनिक IDentifier), जिसे GUID (ग्लोबली यूनिक IDentifier) ​​भी कहा जाता है , कुछ विशिष्ट विशिष्टता गारंटी प्रदान करने के लिए डिज़ाइन किए गए पहचानकर्ता हैं।

हालांकि जेएस की कुछ पंक्तियों में आरएफसी-अनुपालन यूयूआईडी को लागू करना संभव है (जैसे नीचे @ ब्रूफ का जवाब देखें), कई सामान्य नुकसान हैं:

  • अमान्य आईडी प्रारूप (UUIDs फॉर्म " xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx" का होना चाहिए , जहां x [0-9, af] M में से एक है, [1-5] में से एक है, और N [8, 9, a, या b] है
  • यादृच्छिकता के निम्न-गुणवत्ता वाले स्रोत का उपयोग (जैसे Math.random)

इस प्रकार, उत्पादन वातावरण के लिए कोड लिखने वाले डेवलपर्स को एक कठोर, अच्छी तरह से बनाए रखा कार्यान्वयन जैसे कि यूयूआईडी मॉड्यूल का उपयोग करने के लिए प्रोत्साहित किया जाता है ।


186
दरअसल, RFC UUIDs के लिए अनुमति देता है जो यादृच्छिक संख्याओं से बनाई जाती हैं। आपको बस इसे पहचानने के लिए कुछ बिट्स को मोड़ना होगा। खंड 4.4 देखें। सच में रैंडम या छद्म-यादृच्छिक संख्याओं से एक यूयूआईडी
जेसन डीफॉन्ट्स

इस थ्रेड में पहले से ही सब कुछ पर निर्माण, मैंने एक संस्करण बनाया जो दो बार "ई 7" संस्करण के रूप में तेजी से नीचे है, क्रिप्टो-मजबूत है, और सभी प्रमुख ब्राउज़रों और नोड पर काम करता है। यह, यहाँ शामिल इसलिए 17 मई 2020 पर मेरे नाम के साथ एक नया जवाब के लिए देखने के लिए बहुत बड़ा है
बेनेट Barouch

नोड-यूआईडी अब यूआईडी बन गया है (बाद वाली परियोजना के साथ विलय के बाद)
कैटवेज़ल

4104

एक RFC4122 संस्करण 4 अनुरूप समाधान के लिए, यह एक-लाइनर (ईश) समाधान सबसे कॉम्पैक्ट है जिसे मैं ऊपर उठा सकता हूं:

function uuidv4() {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
}

console.log(uuidv4());

अपडेट, 2015-06-02 : ध्यान रखें कि UUID विशिष्टता अंतर्निहित यादृच्छिक संख्या जनरेटर (RNG) पर बहुत निर्भर करती है। का उपयोग करता है इसके बाद के संस्करण समाधान Math.random()संक्षिप्तता के लिए, फिर भी Math.random()है नहीं एक उच्च गुणवत्ता वाले RNG होने की गारंटी। विवरण के लिए Math.random () पर एडम हाइलैंड का उत्कृष्ट राइटअप देखें। अधिक मजबूत समाधान के लिए, uuid मॉड्यूल का उपयोग करने पर विचार करें , जो उच्च गुणवत्ता वाले RNG API का उपयोग करता है।

अद्यतन, 2015/08/26 : अतिरिक्त नोट के रूप में, यह सार का वर्णन करता है निर्धारित करने के लिए कैसे कितने आईडी टक्कर की एक निश्चित संभावना तक पहुँचने से पहले उत्पन्न किया जा सकता। उदाहरण के लिए, 3.26x10 15 संस्करण 4 RFC4122 UUIDs के साथ आपके पास टकराव की संभावना 1 लाख है।

अद्यतन, 2017-06-28 : क्रोम, फ़ायरफ़ॉक्स और सफारी में Math.random PRNG गुणवत्ता की स्थिति पर चर्चा करने वाले क्रोम डेवलपर्स का एक अच्छा लेख । tl; dr - 2015 के अंत तक यह "बहुत अच्छा" है, लेकिन क्रिप्टोग्राफिक गुणवत्ता नहीं है। उस समस्या को हल करने के लिए, यहाँ उपरोक्त समाधान का एक अद्यतन संस्करण है जो ES6, cryptoAPI, और JS JSry का एक सा उपयोग करता है जिनके लिए मैं क्रेडिट नहीं ले सकता :

function uuidv4() {
  return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
    (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  );
}

console.log(uuidv4());

अद्यतन, 2020-01-06 : जेएस भाषा के हिस्से के रूप में एक मानक मॉड्यूल के लिए कार्यों में एक प्रस्ताव हैuuid


30
मैंने टकराव के बारे में एक प्रश्न पोस्ट किया है stackoverflow.com/questions/6906916/…
Muxa

4
@marc - Math.random () की गुणवत्ता एक चिंता का विषय है। लेकिन अंतर्निहित कार्यान्वयन के विस्तृत विश्लेषण के बिना, जो लगभग निश्चित रूप से एक्स-ब्राउज़र बदलता है, हम टकराव की वास्तविक बाधाओं को नहीं जान सकते। इसलिए सादगी के लिए मैं यादृच्छिकता का एक आदर्श स्रोत मान रहा हूं। लेकिन, हाँ, यह एक खतरनाक धारणा हो सकती है क्योंकि muxa का मुद्दा मुख्य आकर्षण है। यह इसलिए भी है क्योंकि नोड-यूआईडी ( github.com/broofa/node-uuid ) मैं अन्य APIs पसंद करता हूं जो Math.random () पर क्रिप्टोग्राफ़िक-गुणवत्ता यादृच्छिकता की गारंटी देता है, भले ही प्रदर्शन इसके लिए ग्रस्त हो।
ब्रूफ़ो जूल

144
निश्चित रूप से @ मुक्सा के प्रश्न का उत्तर 'नहीं' है? क्लाइंट से आए किसी चीज़ पर भरोसा करना वास्तव में कभी भी सुरक्षित नहीं है। मुझे लगता है कि यह इस बात पर निर्भर करता है कि आपके उपयोगकर्ता एक जावास्क्रिप्ट कंसोल को लाने की कितनी संभावना रखते हैं और मैन्युअल रूप से चर को किसी चीज़ में बदलना चाहते हैं। या वे केवल उस पोस्ट को वापस कर सकते हैं जो आप चाहते हैं। यह इस बात पर भी निर्भर करता है कि क्या उपयोगकर्ता अपनी आईडी खुद ही उठा रहा है, जिससे वह कमजोर हो जाएगा। किसी भी तरह से, यदि यह एक यादृच्छिक संख्या आईडी है जो एक तालिका में जा रही है, तो मैं संभवतः इसे सर्वर-साइड जनरेट कर रहा हूं, ताकि मुझे पता हो कि प्रक्रिया पर मेरा नियंत्रण है।
कैम जैक्सन

36
@DrewNoakes - UUIDs पूरी तरह से यादृच्छिक # के स्ट्रिंग नहीं हैं। "4" uuid संस्करण है (4 = "यादृच्छिक")। "Y" निशान जहां uuid संस्करण (क्षेत्र लेआउट, मूल रूप से) को एम्बेड करने की आवश्यकता होती है। अधिक जानकारी के लिए ietf.org/rfc/rfc4122.txt के अनुभाग 4.1.1 और 4.1.3 देखें ।
ब्रूफ़ो

5
क्यों c== 'x'बजाय c === 'x'। क्योंकि जिंटिन विफल है।
Fizer Khan

809

मुझे वास्तव में पसंद है कि ब्रोफा का जवाब कितना साफ है, लेकिन यह दुर्भाग्यपूर्ण है कि टकराने का मौका छोड़ गरीबों के कार्यान्वयन कोMath.random छोड़ दिया गया।

यहाँ एक समान RFC4122 संस्करण 4 आज्ञाकारी समाधान है जो टाइमस्टैम्प के एक हेक्स भाग द्वारा पहले 13 हेक्स संख्याओं को ऑफसेट करके समस्या को हल करता है, और एक बार पगेलॉड के बाद से माइक्रोसेकस के एक हेक्स भाग द्वारा ऑफसेट को समाप्त कर देता है। इस तरह, भले Math.randomही एक ही बीज पर हो, दोनों ग्राहकों को पगेलॉड के बाद से (उच्‍च-पूर्णता समय का समर्थन किया जाता है) और ठीक उसी मिलीसेकंड (या 10,000+ वर्ष बाद) पर UUID को ठीक उसी तरह के माइक्रोसेकंड उत्पन्न करना होगा। समान UUID प्राप्त करें:

function generateUUID() { // Public Domain/MIT
    var d = new Date().getTime();//Timestamp
    var d2 = (performance && performance.now && (performance.now()*1000)) || 0;//Time in microseconds since page-load or 0 if unsupported
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random() * 16;//random number between 0 and 16
        if(d > 0){//Use timestamp until depleted
            r = (d + r)%16 | 0;
            d = Math.floor(d/16);
        } else {//Use microseconds since page-load if supported
            r = (d2 + r)%16 | 0;
            d2 = Math.floor(d2/16);
        }
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
}

console.log(generateUUID())


यहाँ परीक्षण करने के लिए एक बेला है।


31
ध्यान रखें, new Date().getTime()प्रत्येक मिलीसेकंड अद्यतन नहीं किया गया है। मुझे यकीन नहीं है कि यह आपके एल्गोरिथ्म की अपेक्षित यादृच्छिकता को कैसे प्रभावित करता है।
devios1

84
प्रदर्शन। इससे भी बेहतर होगा। Date.now के विपरीत, द्वारा लौटाए गए टाइमस्टैम्प performance.now()एक-मिलीसेकंड रिज़ॉल्यूशन तक सीमित नहीं हैं। इसके बजाय, वे microsecond परिशुद्धता तक फ्लोटिंग-पॉइंट संख्या के रूप में बार का प्रतिनिधित्व करते हैं । Date.now के विपरीत, प्रदर्शन द्वारा लौटाए गए मान .now () हमेशा एक स्थिर दर से बढ़ते हैं , सिस्टम क्लॉक से स्वतंत्र होते हैं जिन्हें नेटवर्क टाइम प्रोटोकॉल जैसे सॉफ़्टवेयर द्वारा मैन्युअल रूप से समायोजित या तिरछा किया जा सकता है।
डेनियलब

6
@daniellmb शायद आपको वास्तविक दस्तावेज दिखाने के लिए MDN या किसी अन्य से जुड़ा होना चाहिए और पॉलीफिल नहीं;)
मार्टिन

2
क्या मुझे पता है कि इसका उपयोग क्या है d = Math.floor(d/16);?
प्रवीण

2
@Praveen यह ऑपरेशन टाइमस्टैम्प एक हेक्स-डिजिट को दाईं ओर स्थानांतरित करता है और शेष छोड़ देता है। इसका उद्देश्य हेक्स अंक से छुटकारा पाने के लिए है जिसे हमने अभी इस्तेमाल किया है (कम से कम महत्वपूर्ण एक) और इसे अगले पुनरावृत्ति के लिए तैयार करें।
ब्रिग्यू 37

430

ब्रूफा का जवाब बहुत चालाक है, वास्तव में - प्रभावशाली रूप से चतुर, वास्तव में ... rfc4122 आज्ञाकारी, कुछ पठनीय और कॉम्पैक्ट। बहुत बढ़िया!

लेकिन अगर आप उस नियमित अभिव्यक्ति को देख रहे हैं, तो वे कई replace()कॉलबैक, toString()और Math.random()फ़ंक्शन कॉल (जहां वह केवल परिणाम के 4 बिट्स का उपयोग कर रहे हैं और बाकी को बर्बाद कर रहे हैं), आप प्रदर्शन के बारे में आश्चर्य करना शुरू कर सकते हैं। वास्तव में, joelpt ने भी सामान्य GUID गति के लिए RFC को टॉस करने का निर्णय लिया generateQuickGUID

लेकिन, क्या हम गति और आरएफसी अनुपालन प्राप्त कर सकते हैं ? मैं हां कहूंगा! क्या हम पठनीयता बनाए रख सकते हैं? खैर ... वास्तव में नहीं, लेकिन अगर आप साथ चलते हैं तो यह आसान है।

लेकिन पहले, मेरे परिणाम, ब्रूफो की तुलना में, guid(स्वीकृत उत्तर), और गैर-आरएफसी-अनुपालन generateQuickGuid:

                  Desktop   Android
           broofa: 1617ms   12869ms
               e1:  636ms    5778ms
               e2:  606ms    4754ms
               e3:  364ms    3003ms
               e4:  329ms    2015ms
               e5:  147ms    1156ms
               e6:  146ms    1035ms
               e7:  105ms     726ms
             guid:  962ms   10762ms
generateQuickGuid:  292ms    2961ms
  - Note: 500k iterations, results will vary by browser/cpu.

तो अनुकूलन के अपने 6 पुनरावृत्ति द्वारा, मैंने सबसे लोकप्रिय उत्तर को 12X से अधिक , 9X से अधिक स्वीकार किए गए उत्तर और 2-3X द्वारा तेज़-गैर-अनुपालन उत्तर को हराया । और मैं अभी भी rfc4122 का अनुपालन कर रहा हूं।

में रुचि कैसे? मैं पर पूर्ण स्रोत डाल दिया http://jsfiddle.net/jcward/7hyaC/3/ और पर http://jsperf.com/uuid-generator-opt/4

एक स्पष्टीकरण के लिए, आइए ब्रूफ़ो के कोड से शुरू करें:

function broofa() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
}

console.log(broofa())

इसलिए यह यादृच्छिक डेटा ( RFC कल्पना के अनुसार शीर्ष 2 बिट्स को छोड़कर) के xसाथ किसी भी यादृच्छिक हेक्स अंक के साथ बदलता है , और रेगेक्स या वर्णों से मेल नहीं खाता है , इसलिए उसे उनसे निपटने की ज़रूरत नहीं है। बहुत, बहुत चालाक।y10-4

यह जानने के लिए पहली बात यह है कि फ़ंक्शन कॉल महंगे हैं, क्योंकि नियमित अभिव्यक्तियाँ हैं (हालांकि वह केवल 1 का उपयोग करता है, इसमें 32 कॉलबैक हैं, प्रत्येक मैच के लिए एक है, और प्रत्येक 32 कॉलबैक में यह Math.random () और v कहता है। toString (16))।

प्रदर्शन की ओर पहला कदम RegEx और इसके कॉलबैक कार्यों को समाप्त करना है और इसके बजाय एक साधारण लूप का उपयोग करना है। इसका मतलब यह है कि हमें पात्रों -और 4पात्रों के साथ व्यवहार करना होगा जबकि ब्रूफो ने नहीं किया। इसके अलावा, ध्यान दें कि हम स्ट्रिंग ऐरे इंडेक्सिंग का उपयोग उसकी स्लीक स्ट्रिंग टेम्प्लेट आर्किटेक्चर रखने के लिए कर सकते हैं:

function e1() {
    var u='',i=0;
    while(i++<36) {
        var c='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'[i-1],r=Math.random()*16|0,v=c=='x'?r:(r&0x3|0x8);
        u+=(c=='-'||c=='4')?c:v.toString(16)
    }
    return u;
}

console.log(e1())

मूल रूप से, एक ही आंतरिक तर्क, सिवाय इसके कि हम जांच करते हैं , -या 4थोड़ी देर के लूप ( replace()कॉलबैक के बजाय ) का उपयोग करने से हमें लगभग 3% सुधार मिलता है!

अगला कदम डेस्कटॉप पर एक छोटा सा है, लेकिन मोबाइल पर एक अच्छा अंतर बनाता है। आइए, कम से कम Math.random () कॉल करें और उन सभी यादृच्छिक बिट्स का उपयोग करें, जिनमें से 87% को फेंकने के बजाय एक यादृच्छिक बफर के साथ जो प्रत्येक पुनरावृत्ति को स्थानांतरित करता है। चलिए उस टेम्प्लेट की परिभाषा को लूप से बाहर करते हैं, बस अगर यह मदद करता है:

function e2() {
    var u='',m='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx',i=0,rb=Math.random()*0xffffffff|0;
    while(i++<36) {
        var c=m[i-1],r=rb&0xf,v=c=='x'?r:(r&0x3|0x8);
        u+=(c=='-'||c=='4')?c:v.toString(16);rb=i%8==0?Math.random()*0xffffffff|0:rb>>4
    }
    return u
}

console.log(e2())

यह प्लेटफॉर्म के आधार पर हमें 10-30% बचाता है। बुरा नहीं। लेकिन अगले बड़े कदम को पूरी तरह से एक अनुकूलन क्लासिक - लुक-अप टेबल के साथ स्टर्लिंग फ़ंक्शन कॉल से छुटकारा मिल जाता है। एक साधारण 16-तत्व लुकअप तालिका बहुत कम समय मेंString (16) का काम करेगी:

function e3() {
    var h='0123456789abcdef';
    var k='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
    /* same as e4() below */
}
function e4() {
    var h=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'];
    var k=['x','x','x','x','x','x','x','x','-','x','x','x','x','-','4','x','x','x','-','y','x','x','x','-','x','x','x','x','x','x','x','x','x','x','x','x'];
    var u='',i=0,rb=Math.random()*0xffffffff|0;
    while(i++<36) {
        var c=k[i-1],r=rb&0xf,v=c=='x'?r:(r&0x3|0x8);
        u+=(c=='-'||c=='4')?c:h[v];rb=i%8==0?Math.random()*0xffffffff|0:rb>>4
    }
    return u
}

console.log(e4())

अगला अनुकूलन एक और क्लासिक है। चूंकि हम प्रत्येक लूप पुनरावृत्ति में केवल 4-बिट आउटपुट को संभाल रहे हैं, चलो लूप की संख्या को आधे में काटते हैं और प्रत्येक पुनरावृत्ति को 8-बिट प्रोसेस करते हैं। यह मुश्किल है क्योंकि हमें अभी भी आरएफसी के अनुरूप पदों को संभालना है, लेकिन यह बहुत कठिन नहीं है। फिर हमें 0x00 - 0xff को स्टोर करने के लिए एक बड़ा लुकअप टेबल (16x16, या 256) बनाना होगा और हम इसे e5 () फ़ंक्शन के बाहर केवल एक बार बनाते हैं।

var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16); }
function e5() {
    var k=['x','x','x','x','-','x','x','-','4','x','-','y','x','-','x','x','x','x','x','x'];
    var u='',i=0,rb=Math.random()*0xffffffff|0;
    while(i++<20) {
        var c=k[i-1],r=rb&0xff,v=c=='x'?r:(c=='y'?(r&0x3f|0x80):(r&0xf|0x40));
        u+=(c=='-')?c:lut[v];rb=i%4==0?Math.random()*0xffffffff|0:rb>>8
    }
    return u
}

console.log(e5())

मैंने एक ई 6 () की कोशिश की, जो एक समय में 16-बिट्स को संसाधित करता है, फिर भी 256-तत्व एलयूटी का उपयोग कर रहा है, और इसने अनुकूलन के कम रिटर्न को दिखाया। यद्यपि इसमें कम पुनरावृत्तियों थे, आंतरिक तर्क बढ़ी हुई प्रसंस्करण द्वारा जटिल था, और इसने डेस्कटॉप पर समान प्रदर्शन किया, और मोबाइल पर केवल ~ 10% तेजी से।

लागू करने के लिए अंतिम अनुकूलन तकनीक - लूप को अनियंत्रित करें। चूंकि हम कई बार निश्चित संख्या में लूपिंग करते हैं, इसलिए हम इसे तकनीकी रूप से हाथ से लिख सकते हैं। मैंने एक बार रैंडम वैरिएबल आर के साथ एक बार यह कोशिश की थी कि मैं फिर से असाइन करता रहूं, और परफॉर्मेंस टैंक हो जाए। लेकिन चार चर के साथ यादृच्छिक डेटा को सामने रखा, फिर लुकअप टेबल का उपयोग किया, और उचित RFC बिट्स को लागू किया, यह संस्करण उन सभी को धूम्रपान करता है:

var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16); }
function e7()
{
    var d0 = Math.random()*0xffffffff|0;
    var d1 = Math.random()*0xffffffff|0;
    var d2 = Math.random()*0xffffffff|0;
    var d3 = Math.random()*0xffffffff|0;
    return lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+
    lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+
    lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+
    lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];
}

console.log(e7())

संशोधित: http://jcward.com/UUID.js -UUID.generate()

मजेदार बात यह है कि रैंडम डेटा के 16 बाइट्स बनाना आसान हिस्सा है। पूरी ट्रिक इसे RFC अनुपालन के साथ स्ट्रिंग प्रारूप में व्यक्त कर रही है, और यह यादृच्छिक डेटा के 16 बाइट्स, एक अनियंत्रित लूप और लुकअप टेबल के साथ सबसे कसकर पूरा किया गया है।

मुझे आशा है कि मेरा तर्क सही है - इस तरह के थकाऊ काम में गलती करना बहुत आसान है। लेकिन आउटपुट मुझे अच्छे लगते हैं। मुझे आशा है कि आपने कोड अनुकूलन के माध्यम से इस पागल सवारी का आनंद लिया!

सलाह दें: मेरा प्राथमिक लक्ष्य संभावित अनुकूलन रणनीतियों को दिखाना और सिखाना था। अन्य उत्तर महत्वपूर्ण विषयों जैसे टकराव और वास्तव में यादृच्छिक संख्या को कवर करते हैं, जो अच्छे यूयूआईडी उत्पन्न करने के लिए महत्वपूर्ण हैं।


14
इस कोड में अभी भी कुछ त्रुटियां हैं: Math.random()*0xFFFFFFFFलाइनें Math.random()*0x100000000पूर्ण यादृच्छिकता के लिए होनी चाहिए , और मानों को बिना बताए रखने >>>0के |0लिए इसका उपयोग किया जाना चाहिए (हालांकि वर्तमान कोड के साथ मुझे लगता है कि यह हस्ताक्षर किए जाने के बावजूद ठीक हो जाता है)। अंत में window.crypto.getRandomValuesयदि उपलब्ध हो तो इन दिनों उपयोग करना बहुत अच्छा होगा और यदि आवश्यक हो तो ही Math.random में फॉल-बैक करें। गणित। आयामी में अच्छी तरह से 128 बिट्स एन्ट्रापी हो सकते हैं, इस स्थिति में यह आवश्यक से टकरावों के लिए अधिक असुरक्षित होगा।
डेव

इस थ्रेड पर पहले से ही सब कुछ का निर्माण, मैंने "e7" के रूप में दो बार तेजी से बनाया है, नोड सहित पोर्टेबल सभी वातावरण, और Math.random () से क्रिप्टो-ताकत यादृच्छिकता के लिए उन्नत। आप यह नहीं सोच सकते हैं कि uuid को क्रिप्टो ताकत की आवश्यकता है, लेकिन इसका क्या मतलब है कि टक्कर की संभावना भी कम है, जो कि एक uuid का संपूर्ण बिंदु है। एक टिप्पणी में फिट होने के लिए बहुत बड़ा, मैंने इसे अलग से पोस्ट किया है।
बेनेट बरोच

163

यहाँ कुछ कोड RFC 4122 , सेक्शन 4.4 (ट्रूली रैंडम या स्यूडो-रैंडम नंबर से UUID बनाने के लिए एल्गोरिदम) पर आधारित है।

function createUUID() {
    // http://www.ietf.org/rfc/rfc4122.txt
    var s = [];
    var hexDigits = "0123456789abcdef";
    for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
    }
    s[14] = "4";  // bits 12-15 of the time_hi_and_version field to 0010
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);  // bits 6-7 of the clock_seq_hi_and_reserved to 01
    s[8] = s[13] = s[18] = s[23] = "-";

    var uuid = s.join("");
    return uuid;
}

4
जब आप GUID का निर्माण करते हैं, तो आपको इसे गतिशील रूप से आकार देने के बजाय सरणी आकार पहले से घोषित करना चाहिए। var s = new Array(36);
MgSam

1
मुझे लगता है कि लाइन में एक बहुत मामूली बग है जो घड़ी के बिट्स को 6-7 सेट करता है_seq_hi_and_reserved to 01. चूँकि s [19] एक वर्ण है '0' .. 'f' और न कि एक int 0x0..0xf (s)। [१ ९] और ० एक्स ३) | 0x8 बेतरतीब ढंग से वितरित नहीं किया जाएगा - यह अधिक '9 और कम' बी का उत्पादन करेगा। यह केवल एक फर्क पड़ता है अगर आप किसी कारण से यादृच्छिक वितरण की परवाह करते हैं।
जॉन वेलोनिस

151
let uniqueId = Math.random().toString(36).substring(2) + Date.now().toString(36);

यदि आईडी 1 मिलीसेकंड से अधिक उत्पन्न होती है, तो वे 100% अद्वितीय हैं।

यदि दो आईडी छोटे अंतराल पर उत्पन्न होती हैं, और यह मानते हुए कि यादृच्छिक विधि वास्तव में यादृच्छिक है, तो यह आईडी उत्पन्न करेगा जो 99.99999999999999% विश्व स्तर पर अद्वितीय होने की संभावना है (10 ^ 15 में से 1 में टकराव)

आप अधिक अंकों को जोड़कर इस संख्या को बढ़ा सकते हैं, लेकिन 100% अद्वितीय आईडी बनाने के लिए आपको एक वैश्विक काउंटर का उपयोग करने की आवश्यकता होगी।

यदि आपको RFC संगतता की आवश्यकता है, तो यह स्वरूपण एक मान्य संस्करण 4 GUID के रूप में पास होगा:

let u = Date.now().toString(16) + Math.random().toString(16) + '0'.repeat(16);
let guid = [u.substr(0,8), u.substr(8,4), '4000-8' + u.substr(13,3), u.substr(16,12)].join('-');

संपादित करें: उपरोक्त कोड इरादे का पालन करता है, लेकिन RFC का पत्र नहीं। अन्य विसंगतियों के बीच यह कुछ यादृच्छिक अंक कम है। (यदि आपको इसकी आवश्यकता है तो अधिक यादृच्छिक अंक जोड़ें) उल्टा यह है कि यह वास्तव में बहुत तेज है :) आप अपने GUID की वैधता का परीक्षण कर सकते हैं


4
हालांकि यह यूयूआईडी नहीं है?
मार्को केर्वित्ज

नंबर UUID / GUID की संख्या 122 बिट (+ छह आरक्षित बिट्स) है। यह एक वैश्विक काउंटर सेवा के माध्यम से विशिष्टता की गारंटी दे सकता है, लेकिन अक्सर यह समय, मैक पते और यादृच्छिकता पर निर्भर करता है। UUID यादृच्छिक नहीं हैं! यूआईडी I सुझाव है कि यहां पूरी तरह से संपीड़ित नहीं है। आप इसे संक्षिप्त कर सकते हैं, एक 122 बिट पूर्णांक के लिए, 6 पूर्वनिर्धारित बिट्स और अतिरिक्त यादृच्छिक बिट्स (कुछ टाइमर बिट्स को हटा दें) जोड़ सकते हैं और आप पूरी तरह से गठित यूयूआईडी / गाइड के साथ समाप्त होते हैं, जिसे आपको हेक्स में बदलना होगा। मेरे लिए जो वास्तव में आईडी की लंबाई के अनुपालन के अलावा और कुछ नहीं जोड़ता है।
साइमन रिगेट

5
आभासी मशीनों पर विशिष्टता के लिए मैक पते पर रिले करना एक बुरा विचार है!
साइमन रिगेट

1
मैं ऐसा कुछ करता हूं, लेकिन प्रमुख पात्रों और कुछ डैश के साथ (जैसे [slug, date, random].join("_")बनाने के लिए usr_1dcn27itd_hj6onj6phr। यह इतना बनाता है कि आईडी भी "फ़ील्ड पर बनाई गई" के रूप में दोगुनी हो जाती है
सिपाही रीड

95

प्रारूप में स्ट्रिंग जनरेटर विधि की तरह सबसे तेज़ GUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX। यह मानक-अनुपालन GUID उत्पन्न नहीं करता है।

इस कार्यान्वयन के दस मिलियन निष्पादन में सिर्फ 32.5 सेकंड लगते हैं, जो कि मैंने अब तक के ब्राउज़र में सबसे तेज़ देखा है (लूप / पुनरावृत्तियों के बिना एकमात्र समाधान)।

यह कार्य जितना सरल है:

/**
 * Generates a GUID string.
 * @returns {string} The generated GUID.
 * @example af8a8416-6e18-a307-bd9c-f2c947bbb3aa
 * @author Slavik Meltser.
 * @link http://slavik.meltser.info/?p=142
 */
function guid() {
    function _p8(s) {
        var p = (Math.random().toString(16)+"000000000").substr(2,8);
        return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;
    }
    return _p8() + _p8(true) + _p8(true) + _p8();
}

प्रदर्शन का परीक्षण करने के लिए, आप इस कोड को चला सकते हैं:

console.time('t'); 
for (var i = 0; i < 10000000; i++) { 
    guid(); 
};
console.timeEnd('t');

मुझे यकीन है कि आप में से अधिकांश समझ जाएंगे कि मैंने वहां क्या किया, लेकिन शायद कम से कम एक व्यक्ति है जिसे स्पष्टीकरण की आवश्यकता होगी:

एल्गोरिथ्म:

  • Math.random()समारोह दशमलव भिन्न बिंदु (उदाहरण के लिए के बाद 16 अंकों के साथ 0 और 1 के बीच एक दशमलव संख्या देता है 0.4363923368509859)।
  • फिर हम इस संख्या को लेते हैं और इसे आधार 16 के साथ एक स्ट्रिंग में परिवर्तित करते हैं (ऊपर दिए गए उदाहरण से हम प्राप्त करेंगे 0.6fb7687f)।
    Math.random().toString(16)
  • फिर हम 0.उपसर्ग ( 0.6fb7687f=> 6fb7687f) को काटते हैं और आठ हेक्साडेसिमल वर्णों के साथ एक स्ट्रिंग प्राप्त करते हैं।
    (Math.random().toString(16).substr(2,8)
  • कभी-कभी Math.random()फ़ंक्शन छोटी संख्या (उदाहरण के लिए 0.4363), अंत में शून्य के कारण (ऊपर के उदाहरण से, वास्तव में संख्या 0.4363000000000000) वापस आ जाएगी। इसलिए मैं इस स्ट्रिंग "000000000"(नौ शून्य के साथ एक स्ट्रिंग) के लिए अपील कर रहा हूं और फिर substr()इसे नौ वर्णों के साथ ठीक करने के लिए फ़ंक्शन के साथ काट रहा हूं (शून्य को दाईं ओर भरना)।
  • ठीक नौ शून्य जोड़ने का कारण यह है कि बदतर स्थिति, जो कि जब Math.random()फ़ंक्शन ठीक 0 या 1 (उनमें से प्रत्येक के लिए 1/10 ^ 16 की संभावना) वापस आ जाएगी। इसलिए हमें इसे ( "0"+"000000000"या "1"+"000000000") में नौ शून्य जोड़ने की जरूरत थी , और फिर आठ वर्णों की लंबाई के साथ इसे दूसरे सूचकांक (3 जी चरित्र) से काट दिया गया। बाकी मामलों के लिए, शून्य का जोड़ परिणाम को नुकसान नहीं पहुंचाएगा क्योंकि यह इसे वैसे भी काट रहा है।
    Math.random().toString(16)+"000000000").substr(2,8)

सभा:

  • GUID निम्नलिखित प्रारूप में है XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
  • मैंने GUID को 4 टुकड़ों में विभाजित किया है, प्रत्येक टुकड़ा 2 प्रकारों (या स्वरूपों) में विभाजित है: XXXXXXXXऔर -XXXX-XXXX
  • अब मैं कॉल 4 टुकड़े के साथ GUID इकट्ठा करने के लिए इन 2 प्रकार का उपयोग कर GUID निर्माण कर रहा हूँ, के रूप में इस प्रकार है: XXXXXXXX -XXXX-XXXX -XXXX-XXXX XXXXXXXX
  • इन दो प्रकारों के बीच अंतर करने के लिए, मैंने एक जोड़ी निर्माता फ़ंक्शन में एक ध्वज पैरामीटर जोड़ा _p8(s), sपैरामीटर फ़ंक्शन को बताता है कि डैश को जोड़ना है या नहीं।
  • अंततः हम GUID का निर्माण निम्नलिखित चाइनिंग के साथ करते हैं: _p8() + _p8(true) + _p8(true) + _p8()और इसे वापस करते हैं।

मेरे ब्लॉग पर इस पोस्ट का लिंक

का आनंद लें! :-)


13
यह क्रियान्वयन गलत है। GUID के कुछ पात्रों को विशेष उपचार की आवश्यकता होती है (उदाहरण के लिए 13 वें अंक को नंबर 4 होना चाहिए)।
JLRishe

67

क्रोम के टकरावों के लिए समाधान के साथ, यहाँ शीर्ष मतदान जवाब का एक संयोजन दिया गया है :

generateGUID = (typeof(window.crypto) != 'undefined' && 
                typeof(window.crypto.getRandomValues) != 'undefined') ?
    function() {
        // If we have a cryptographically secure PRNG, use that
        // /programming/6906916/collisions-when-generating-uuids-in-javascript
        var buf = new Uint16Array(8);
        window.crypto.getRandomValues(buf);
        var S4 = function(num) {
            var ret = num.toString(16);
            while(ret.length < 4){
                ret = "0"+ret;
            }
            return ret;
        };
        return (S4(buf[0])+S4(buf[1])+"-"+S4(buf[2])+"-"+S4(buf[3])+"-"+S4(buf[4])+"-"+S4(buf[5])+S4(buf[6])+S4(buf[7]));
    }

    :

    function() {
        // Otherwise, just use Math.random
        // /programming/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
            return v.toString(16);
        });
    };

Jsbin पर यदि आप इसका परीक्षण करना चाहते हैं।


3
ध्यान दें कि पहला संस्करण, एक `window.crypto.getRandomValues , does not keep the Version 4 UUIDs format defined by RFC 4122. That is instead of xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx` इसकी पैदावार है xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
मानवतावादी

66

यहां ASCII- सुरक्षित GUID- जैसे विशिष्ट पहचानकर्ता को उत्पन्न करने के लिए पूरी तरह से गैर-अनुपालन योग्य लेकिन बहुत अच्छा कार्यान्वयन है।

function generateQuickGuid() {
    return Math.random().toString(36).substring(2, 15) +
        Math.random().toString(36).substring(2, 15);
}

26 [a-z0-9] वर्ण उत्पन्न करता है, एक UID का उत्पादन करता है जो RFC अनुरूप GUID की तुलना में कम और अद्वितीय दोनों है। यदि मानव-पठनीयता मायने रखती है तो डैश को तुच्छ रूप से जोड़ा जा सकता है।

इस फ़ंक्शन के लिए उपयोग के उदाहरण और समय हैं और इस प्रश्न के कई अन्य उत्तर हैं। क्रोम m25, 10 मिलियन पुनरावृत्तियों में से प्रत्येक के दौरान समय का प्रदर्शन किया गया था।

>>> generateQuickGuid()
"nvcjf1hs7tf8yyk4lmlijqkuo9"
"yq6gipxqta4kui8z05tgh9qeel"
"36dh5sec7zdj90sk2rx7pjswi2"
runtime: 32.5s

>>> GUID() // John Millikin
"7a342ca2-e79f-528e-6302-8f901b0b6888"
runtime: 57.8s

>>> regexGuid() // broofa
"396e0c46-09e4-4b19-97db-bd423774a4b3"
runtime: 91.2s

>>> createUUID() // Kevin Hakanson
"403aa1ab-9f70-44ec-bc08-5d5ac56bd8a5"
runtime: 65.9s

>>> UUIDv4() // Jed Schmidt
"f4d7d31f-fa83-431a-b30c-3e6cc37cc6ee"
runtime: 282.4s

>>> Math.uuid() // broofa
"5BD52F55-E68F-40FC-93C2-90EE069CE545"
runtime: 225.8s

>>> Math.uuidFast() // broofa
"6CB97A68-23A2-473E-B75B-11263781BBE6"
runtime: 92.0s

>>> Math.uuidCompact() // broofa
"3d7b7a06-0a67-4b67-825c-e5c43ff8c1e8"
runtime: 229.0s

>>> bitwiseGUID() // jablko
"baeaa2f-7587-4ff1-af23-eeab3e92"
runtime: 79.6s

>>>> betterWayGUID() // Andrea Turri
"383585b0-9753-498d-99c3-416582e9662c"
runtime: 60.0s

>>>> UUID() // John Fowler
"855f997b-4369-4cdb-b7c9-7142ceaf39e8"
runtime: 62.2s

यहाँ समय कोड है।

var r;
console.time('t'); 
for (var i = 0; i < 10000000; i++) { 
    r = FuncToTest(); 
};
console.timeEnd('t');

62

यहाँ उपयोगकर्ता द्वारा एक टिप्पणी से एक समाधान दिनांकित अक्टूबर 9, 2011 के जेड पर https://gist.github.com/982883 :

UUIDv4 = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}

यह वर्तमान उच्चतम-श्रेणी के उत्तर के रूप में एक ही लक्ष्य को पूरा करता है , लेकिन 50+ कम बाइट में शोषण, पुनरावृत्ति और घातीय संकेतन का उपयोग करके। उन उत्सुक लोगों के लिए कि यह कैसे काम करता है, यहाँ फ़ंक्शन के पुराने संस्करण का एनोटेट रूप है:

UUIDv4 =

function b(
  a // placeholder
){
  return a // if the placeholder was passed, return
    ? ( // a random number from 0 to 15
      a ^ // unless b is 8,
      Math.random() // in which case
      * 16 // a random number from
      >> a/4 // 8 to 11
      ).toString(16) // in hexadecimal
    : ( // or otherwise a concatenated string:
      [1e7] + // 10000000 +
      -1e3 + // -1000 +
      -4e3 + // -4000 +
      -8e3 + // -80000000 +
      -1e11 // -100000000000,
      ).replace( // replacing
        /[018]/g, // zeroes, ones, and eights with
        b // random hex digits
      )
}

52

से Sagi shkedy तकनीकी ब्लॉग क्या होता है :

function generateGuid() {
  var result, i, j;
  result = '';
  for(j=0; j<32; j++) {
    if( j == 8 || j == 12 || j == 16 || j == 20) 
      result = result + '-';
    i = Math.floor(Math.random()*16).toString(16).toUpperCase();
    result = result + i;
  }
  return result;
}

ActiveX नियंत्रण का उपयोग करने के अन्य तरीके हैं, लेकिन इन से दूर रहें!

संपादित करें: मुझे लगा कि यह इंगित करने के लायक है कि कोई भी GUID जनरेटर अद्वितीय कुंजी की गारंटी नहीं दे सकता है ( विकिपीडिया लेख की जांच करें )। हमेशा टकराव की संभावना होती है। GUID बस लगभग शून्य से टकराव के परिवर्तन को कम करने के लिए कुंजियों का एक बड़ा पर्याप्त ब्रह्मांड प्रदान करता है।


8
ध्यान दें कि यह तकनीकी अर्थों में एक GUID नहीं है, क्योंकि यह विशिष्टता की गारंटी के लिए कुछ भी नहीं करता है। आपके आवेदन पर निर्भर करता है या नहीं हो सकता है।
स्टीफन डेकेन

2
प्रदर्शन के बारे में एक त्वरित टिप्पणी। यह समाधान एकल परिणाम प्राप्त करने के लिए कुल 36 स्ट्रिंग्स बनाता है। यदि प्रदर्शन महत्वपूर्ण है, तो एक सरणी बनाने पर विचार करें और अनुशंसा के अनुसार इसमें शामिल हों: smallurl.com/y37xtx आगे के शोध से यह संकेत मिलता है कि यह कोई फर्क नहीं पड़ता, इसलिए YMMV: tinyurl.com/3l7945
Brandon DuRette

2
विशिष्टता के बारे में, यह ध्यान देने योग्य है कि संस्करण 1,3, और 5 UUIDs निर्धारक तरीके से हैं संस्करण 4 नहीं है। यदि इन uuid जनरेटर के इनपुट - v1 में नोड आईडी, नाम स्थान और v3 और v5 में नाम अद्वितीय हैं (जैसा कि वे माना जाता है), तो परिणामी यूयूआईडी अद्वितीय हैं। सिद्धांत में, वैसे भी।
ब्रूफा

41

आप नोड- uuid ( https://github.com/kelektiv/node-uuid ) का उपयोग कर सकते हैं

RFC4122 UUIDS की सरल, तेज पीढ़ी ।

विशेषताएं:

  • RFC4122 संस्करण 1 या संस्करण 4 UUIDs उत्पन्न करें
  • नोड.जेएस और ब्राउज़र में चलता है।
  • समर्थन प्लेटफार्मों पर क्रिप्टोग्राफिक रूप से मजबूत यादृच्छिक # पीढ़ी।
  • छोटा पदचिह्न (कुछ छोटा चाहते हैं? यह देखें! )

एनपीएम का उपयोग कर स्थापित करें:

npm install uuid

या ब्राउज़र के माध्यम से uuid का उपयोग करना:

रॉ फ़ाइल डाउनलोड करें (uuid v1): https://raw.githubusercontent.com/kelektiv/node-uuid/master/v1.js डाउनलोड रॉ फ़ाइल (uuid v4): https://raw.githubusercontent.com/kelektiv/node -uuid / मास्टर / v4.js


और भी छोटा चाहिए? इसे देखें: https://gist.github.com/jed/982883


उपयोग:

// Generate a v1 UUID (time-based)
const uuidV1 = require('uuid/v1');
uuidV1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'

// Generate a v4 UUID (random)
const uuidV4 = require('uuid/v4');
uuidV4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'

// Generate a v5 UUID (namespace)
const uuidV5 = require('uuid/v5');

// ... using predefined DNS namespace (for domain names)
uuidV5('hello.example.com', v5.DNS)); // -> 'fdda765f-fc57-5604-a269-52a7df8164ec'

// ... using predefined URL namespace (for, well, URLs)
uuidV5('http://example.com/hello', v5.URL); // -> '3bbcee75-cecc-5b56-8031-b6641c1ed1f1'

// ... using a custom namespace
const MY_NAMESPACE = '(previously generated unique uuid string)';
uuidV5('hello', MY_NAMESPACE); // -> '90123e1c-7512-523e-bb28-76fab9f2f73d'

ES6:

import uuid from 'uuid/v4';
const id = uuid();

34
var uuid = function() {
    var buf = new Uint32Array(4);
    window.crypto.getRandomValues(buf);
    var idx = -1;
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        idx++;
        var r = (buf[idx>>3] >> ((idx%8)*4))&15;
        var v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
    });
};

संपादित करें:

इस परियोजना का उपयोग करने वाली मेरी परियोजना पर दोबारा गौर किया और इस क्रिया को नापसंद किया। - लेकिन उचित यादृच्छिकता की जरूरत है।

एक संस्करण Briguy37 के उत्तर पर आधारित है और कुछ बिटवाइज़ ऑपरेटर्स बफर से निबल आकार की खिड़कियां निकालने के लिए।

आरएफसी टाइप 4 (रैंडम) स्कीमा का पालन करना चाहिए, क्योंकि मुझे पिछली बार जावा के यूयूआईडी के साथ गैर-अनुपालन वाले यूआईआईडी को पार्स करने में समस्या थी।


31

इस धागे में सबसे अच्छा जवाब के संयोजन के रूप में सरल जावास्क्रिप्ट मॉड्यूल।

var crypto = window.crypto || window.msCrypto || null; // IE11 fix

var Guid = Guid || (function() {

  var EMPTY = '00000000-0000-0000-0000-000000000000';

  var _padLeft = function(paddingString, width, replacementChar) {
    return paddingString.length >= width ? paddingString : _padLeft(replacementChar + paddingString, width, replacementChar || ' ');
  };

  var _s4 = function(number) {
    var hexadecimalResult = number.toString(16);
    return _padLeft(hexadecimalResult, 4, '0');
  };

  var _cryptoGuid = function() {
    var buffer = new window.Uint16Array(8);
    window.crypto.getRandomValues(buffer);
    return [_s4(buffer[0]) + _s4(buffer[1]), _s4(buffer[2]), _s4(buffer[3]), _s4(buffer[4]), _s4(buffer[5]) + _s4(buffer[6]) + _s4(buffer[7])].join('-');
  };

  var _guid = function() {
    var currentDateMilliseconds = new Date().getTime();
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(currentChar) {
      var randomChar = (currentDateMilliseconds + Math.random() * 16) % 16 | 0;
      currentDateMilliseconds = Math.floor(currentDateMilliseconds / 16);
      return (currentChar === 'x' ? randomChar : (randomChar & 0x7 | 0x8)).toString(16);
    });
  };

  var create = function() {
    var hasCrypto = crypto != 'undefined' && crypto !== null,
      hasRandomValues = typeof(window.crypto.getRandomValues) != 'undefined';
    return (hasCrypto && hasRandomValues) ? _cryptoGuid() : _guid();
  };

  return {
    newGuid: create,
    empty: EMPTY
  };
})();

// DEMO: Create and show GUID
console.log(Guid.newGuid());

उपयोग:

Guid.NewGuid ()

"C6c2d12f-d76b-5739-e551-07e6de5b0807"

Guid.empty

"00000000-0000-0000-0000-000000000000"


1
सभी उत्तरों के बारे में परेशान करने वाली बात यह है कि जावास्क्रिप्ट को ए के रूप में संग्रहीत करना ठीक लगता GUIDहै string। आपका जवाब कम से कम टैकल पर बहुत अधिक कुशल भंडारण एक का उपयोग कर Uint16ArraytoStringसमारोह एक JavaScript में बाइनरी प्रतिनिधित्व का उपयोग कर किया जाना चाहिएobject
सेबस्टियन

इस कोड द्वारा निर्मित यह UUIDs या तो कमजोर-लेकिन-RFC-compliant (_guid) हैं, या मजबूत-लेकिन-नहीं-RFC-compliant (_cryptoGuid) हैं। पूर्व में Math.random () का उपयोग करता है, जिसे अब एक गरीब RNG के रूप में जाना जाता है। उत्तरार्द्ध संस्करण और संस्करण फ़ील्ड सेट करने में विफल हो रहा है।
ब्रूफा

@broofa - आप इसे मजबूत और RFC-अनुरूप बनाने के लिए क्या सुझाव देंगे ? और _cryptoGuid RFC-compliant क्यों नहीं है?
मैट

@Matt _cryptoGuid () सभी 128 बिट्स को यादृच्छिक रूप से सेट करता है, जिसका अर्थ है कि यह RFC में वर्णित संस्करण और संस्करण फ़ील्ड सेट नहीं करता है। Uuidv4 के अपने वैकल्पिक कार्यान्वयन () को देखें, जो एक मजबूत + अनुरूप कार्यान्वयन के लिए मेरे शीर्ष-मतदान जवाब में crypto.getRandomValues ​​() का उपयोग करता है।
ब्रूफो

29

यह संस्करण 4 यूयूआईडी बनाता है (छद्म यादृच्छिक संख्याओं से निर्मित):

function uuid()
{
   var chars = '0123456789abcdef'.split('');

   var uuid = [], rnd = Math.random, r;
   uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
   uuid[14] = '4'; // version 4

   for (var i = 0; i < 36; i++)
   {
      if (!uuid[i])
      {
         r = 0 | rnd()*16;

         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
      }
   }

   return uuid.join('');
}

यहाँ उत्पन्न UUIDs का एक नमूना है:

682db637-0f31-4847-9cdf-25ba9613a75c
97d19478-3ab2-4aa1-b8cc-a1c3540f54aa
2eed04c9-2692-456d-a0fd-51012f947136

28

खैर, यह पहले से ही जवाब का एक गुच्छा है, लेकिन दुर्भाग्य से गुच्छा में "सच" यादृच्छिक नहीं है। नीचे दिया गया संस्करण ब्रूफो के उत्तर का एक अनुकूलन है, लेकिन "ट्रू" यादृच्छिक फ़ंक्शन को शामिल करने के लिए अपडेट किया गया है जो क्रिप्टो लाइब्रेरीज़ का उपयोग करता है, जहां उपलब्ध है, और एलिया () फॉलबैक के रूप में कार्य करता है।

  Math.log2 = Math.log2 || function(n){ return Math.log(n) / Math.log(2); }
  Math.trueRandom = (function() {
  var crypt = window.crypto || window.msCrypto;

  if (crypt && crypt.getRandomValues) {
      // if we have a crypto library, use it
      var random = function(min, max) {
          var rval = 0;
          var range = max - min;
          if (range < 2) {
              return min;
          }

          var bits_needed = Math.ceil(Math.log2(range));
          if (bits_needed > 53) {
            throw new Exception("We cannot generate numbers larger than 53 bits.");
          }
          var bytes_needed = Math.ceil(bits_needed / 8);
          var mask = Math.pow(2, bits_needed) - 1;
          // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111

          // Create byte array and fill with N random numbers
          var byteArray = new Uint8Array(bytes_needed);
          crypt.getRandomValues(byteArray);

          var p = (bytes_needed - 1) * 8;
          for(var i = 0; i < bytes_needed; i++ ) {
              rval += byteArray[i] * Math.pow(2, p);
              p -= 8;
          }

          // Use & to apply the mask and reduce the number of recursive lookups
          rval = rval & mask;

          if (rval >= range) {
              // Integer out of acceptable range
              return random(min, max);
          }
          // Return an integer that falls within the range
          return min + rval;
      }
      return function() {
          var r = random(0, 1000000000) / 1000000000;
          return r;
      };
  } else {
      // From https://web.archive.org/web/20120502223108/http://baagoe.com/en/RandomMusings/javascript/
      // Johannes Baagøe <baagoe@baagoe.com>, 2010
      function Mash() {
          var n = 0xefc8249d;

          var mash = function(data) {
              data = data.toString();
              for (var i = 0; i < data.length; i++) {
                  n += data.charCodeAt(i);
                  var h = 0.02519603282416938 * n;
                  n = h >>> 0;
                  h -= n;
                  h *= n;
                  n = h >>> 0;
                  h -= n;
                  n += h * 0x100000000; // 2^32
              }
              return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
          };

          mash.version = 'Mash 0.9';
          return mash;
      }

      // From http://baagoe.com/en/RandomMusings/javascript/
      function Alea() {
          return (function(args) {
              // Johannes Baagøe <baagoe@baagoe.com>, 2010
              var s0 = 0;
              var s1 = 0;
              var s2 = 0;
              var c = 1;

              if (args.length == 0) {
                  args = [+new Date()];
              }
              var mash = Mash();
              s0 = mash(' ');
              s1 = mash(' ');
              s2 = mash(' ');

              for (var i = 0; i < args.length; i++) {
                  s0 -= mash(args[i]);
                  if (s0 < 0) {
                      s0 += 1;
                  }
                  s1 -= mash(args[i]);
                  if (s1 < 0) {
                      s1 += 1;
                  }
                  s2 -= mash(args[i]);
                  if (s2 < 0) {
                      s2 += 1;
                  }
              }
              mash = null;

              var random = function() {
                  var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
                  s0 = s1;
                  s1 = s2;
                  return s2 = t - (c = t | 0);
              };
              random.uint32 = function() {
                  return random() * 0x100000000; // 2^32
              };
              random.fract53 = function() {
                  return random() +
                      (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
              };
              random.version = 'Alea 0.9';
              random.args = args;
              return random;

          }(Array.prototype.slice.call(arguments)));
      };
      return Alea();
  }
}());

Math.guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c)    {
      var r = Math.trueRandom() * 16 | 0,
          v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
  });
};

27

GitHub पर जावास्क्रिप्ट परियोजना - https://github.com/LiosK/UUID.js

UUID.js जावास्क्रिप्ट के लिए RFC-अनुरूप UUID जनरेटर।

RFC 4122 http://www.ietf.org/rfc/rfc4122.txt देखें ।

सुविधाएँ RFC 4122 अनुरूप UUIDs उत्पन्न करता है।

संस्करण 4 यूयूआईडी (यादृच्छिक संख्या से यूयूआईडी) और संस्करण 1 यूयूआईडी (समय-आधारित यूयूआईडी) उपलब्ध हैं।

UUID ऑब्जेक्ट UUID तक पहुँच की एक किस्म की अनुमति देता है जिसमें UUID क्षेत्रों तक पहुँच शामिल है।

जावास्क्रिप्ट के कम टाइमस्टैम्प संकल्प को यादृच्छिक संख्याओं द्वारा मुआवजा दिया जाता है।


21
  // RFC 4122
  //
  // A UUID is 128 bits long
  //
  // String representation is five fields of 4, 2, 2, 2, and 6 bytes.
  // Fields represented as lowercase, zero-filled, hexadecimal strings, and
  // are separated by dash characters
  //
  // A version 4 UUID is generated by setting all but six bits to randomly
  // chosen values
  var uuid = [
    Math.random().toString(16).slice(2, 10),
    Math.random().toString(16).slice(2, 6),

    // Set the four most significant bits (bits 12 through 15) of the
    // time_hi_and_version field to the 4-bit version number from Section
    // 4.1.3
    (Math.random() * .0625 /* 0x.1 */ + .25 /* 0x.4 */).toString(16).slice(2, 6),

    // Set the two most significant bits (bits 6 and 7) of the
    // clock_seq_hi_and_reserved to zero and one, respectively
    (Math.random() * .25 /* 0x.4 */ + .5 /* 0x.8 */).toString(16).slice(2, 6),

    Math.random().toString(16).slice(2, 14)].join('-');

16

मैं ब्रूफ़ो के उत्तर को समझना चाहता था, इसलिए मैंने इसका विस्तार किया और टिप्पणियाँ जोड़ीं:

var uuid = function () {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
        /[xy]/g,
        function (match) {
            /*
            * Create a random nibble. The two clever bits of this code:
            *
            * - Bitwise operations will truncate floating point numbers
            * - For a bitwise OR of any x, x | 0 = x
            *
            * So:
            *
            * Math.random * 16
            *
            * creates a random floating point number
            * between 0 (inclusive) and 16 (exclusive) and
            *
            * | 0
            *
            * truncates the floating point number into an integer.
            */
            var randomNibble = Math.random() * 16 | 0;

            /*
            * Resolves the variant field. If the variant field (delineated
            * as y in the initial string) is matched, the nibble must
            * match the mask (where x is a do-not-care bit):
            *
            * 10xx
            *
            * This is achieved by performing the following operations in
            * sequence (where x is an intermediate result):
            *
            * - x & 0x3, which is equivalent to x % 3
            * - x | 0x8, which is equivalent to x + 8
            *
            * This results in a nibble between 8 inclusive and 11 exclusive,
            * (or 1000 and 1011 in binary), all of which satisfy the variant
            * field mask above.
            */
            var nibble = (match == 'y') ?
                (randomNibble & 0x3 | 0x8) :
                randomNibble;

            /*
            * Ensure the nibble integer is encoded as base 16 (hexadecimal).
            */
            return nibble.toString(16);
        }
    );
};

विस्तृत विवरण के लिए धन्यवाद! विशेष रूप से समकक्ष व्याख्या के साथ 8 और 11 के बीच बंदे हुए निबल सुपर सहायक होते हैं।
Egor Litvinchuk

15

यहाँ कुछ एक्स्ट्रा के साथ मेरे अपने UUID / GUID जनरेटर को समायोजित किया ।

मैं निम्नलिखित क्यबोस यादृच्छिक संख्या जनरेटर का उपयोग थोड़ा अधिक क्रिप्टोग्राफिक रूप से ध्वनि करने के लिए कर रहा हूं ।

नीचे baagoe.com से मैश और क्यबोस विधियों के साथ मेरी स्क्रिप्ट को बाहर रखा गया है।

//UUID/Guid Generator
// use: UUID.create() or UUID.createSequential()
// convenience:  UUID.empty, UUID.tryParse(string)
(function(w){
  // From http://baagoe.com/en/RandomMusings/javascript/
  // Johannes Baagøe <baagoe@baagoe.com>, 2010
  //function Mash() {...};

  // From http://baagoe.com/en/RandomMusings/javascript/
  //function Kybos() {...};

  var rnd = Kybos();

  //UUID/GUID Implementation from http://frugalcoder.us/post/2012/01/13/javascript-guid-uuid-generator.aspx
  var UUID = {
    "empty": "00000000-0000-0000-0000-000000000000"
    ,"parse": function(input) {
      var ret = input.toString().trim().toLowerCase().replace(/^[\s\r\n]+|[\{\}]|[\s\r\n]+$/g, "");
      if ((/[a-f0-9]{8}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{4}\-[a-f0-9]{12}/).test(ret))
        return ret;
      else
        throw new Error("Unable to parse UUID");
    }
    ,"createSequential": function() {
      var ret = new Date().valueOf().toString(16).replace("-","")
      for (;ret.length < 12; ret = "0" + ret);
      ret = ret.substr(ret.length-12,12); //only least significant part
      for (;ret.length < 32;ret += Math.floor(rnd() * 0xffffffff).toString(16));
      return [ret.substr(0,8), ret.substr(8,4), "4" + ret.substr(12,3), "89AB"[Math.floor(Math.random()*4)] + ret.substr(16,3),  ret.substr(20,12)].join("-");
    }
    ,"create": function() {
      var ret = "";
      for (;ret.length < 32;ret += Math.floor(rnd() * 0xffffffff).toString(16));
      return [ret.substr(0,8), ret.substr(8,4), "4" + ret.substr(12,3), "89AB"[Math.floor(Math.random()*4)] + ret.substr(16,3),  ret.substr(20,12)].join("-");
    }
    ,"random": function() {
      return rnd();
    }
    ,"tryParse": function(input) {
      try {
        return UUID.parse(input);
      } catch(ex) {
        return UUID.empty;
      }
    }
  };
  UUID["new"] = UUID.create;

  w.UUID = w.Guid = UUID;
}(window || this));

15

गति विचार के साथ एक rfc4122 संस्करण 4 अनुरूप समाधान चाहने वालों के लिए (Math.random () के लिए कुछ कॉल):

var rand = Math.random;

function UUID() {
    var nbr, randStr = "";
    do {
        randStr += (nbr = rand()).toString(16).substr(3, 6);
    } while (randStr.length < 30);
    return (
        randStr.substr(0, 8) + "-" +
        randStr.substr(8, 4) + "-4" +
        randStr.substr(12, 3) + "-" +
        ((nbr*4|0)+8).toString(16) + // [89ab]
        randStr.substr(15, 3) + "-" +
        randStr.substr(18, 12)
    );
}

console.log( UUID() );

उपरोक्त फ़ंक्शन में गति और यादृच्छिकता के बीच एक सभ्य संतुलन होना चाहिए।



12

बेहतर तरीका:

function(
  a,b                // placeholders
){
  for(               // loop :)
      b=a='';        // b - result , a - numeric variable
      a++<36;        // 
      b+=a*51&52  // if "a" is not 9 or 14 or 19 or 24
                  ?  //  return a random number or 4
         (
           a^15      // if "a" is not 15
              ?      // genetate a random number from 0 to 15
           8^Math.random()*
           (a^20?16:4)  // unless "a" is 20, in which case a random number from 8 to 11
              :
           4            //  otherwise 4
           ).toString(16)
                  :
         '-'            //  in other cases (if "a" is 9,14,19,24) insert "-"
      );
  return b
 }

कम से कम:

function(a,b){for(b=a='';a++<36;b+=a*51&52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):'-');return b}

11

मुझे पता है, यह एक पुराना सवाल है। पूर्णता के लिए, यदि आपका वातावरण SharePoint है, तो एक उपयोगिता फ़ंक्शन है जिसे SP.Guid.newGuid( msdn लिंक ) कहा जाता है जो एक नया गाइड बनाता है। यह फ़ंक्शन sp.init.js फ़ाइल के अंदर है। यदि आप इस फ़ंक्शन को फिर से लिखते हैं (अन्य निजी कार्यों से कुछ अन्य निर्भरता को हटाने के लिए), तो यह इस तरह दिखता है:

var newGuid = function () {
    var result = '';
    var hexcodes = "0123456789abcdef".split("");

    for (var index = 0; index < 32; index++) {
        var value = Math.floor(Math.random() * 16);

        switch (index) {
        case 8:
            result += '-';
            break;
        case 12:
            value = 4;
            result += '-';
            break;
        case 16:
            value = value & 3 | 8;
            result += '-';
            break;
        case 20:
            result += '-';
            break;
        }
        result += hexcodes[value];
    }
    return result;
};

11

यह एक तारीख पर आधारित है, और विशिष्टता सुनिश्चित करने के लिए एक यादृच्छिक प्रत्यय जोड़ते हैं। सीएसएस पहचानकर्ताओं के लिए अच्छी तरह से काम करता है। यह हमेशा कुछ पसंद करता है और हैक करना आसान है:

यूआईडी-139410573297741

var getUniqueId = function (prefix) {
            var d = new Date().getTime();
            d += (parseInt(Math.random() * 100)).toString();
            if (undefined === prefix) {
                prefix = 'uid-';
            }
            d = prefix + d;
            return d;
        };

11

सरल कोड है कि का उपयोग करता है crypto.getRandomValues(a)पर समर्थित ब्राउज़रों (IE11 +, iOS7 +, FF21 + Chrome, Android क्रोम)। का उपयोग कर से बचा जाता है Math.random(), क्योंकि वह टकराव से (उदाहरण के लिए 4000 उत्पन्न UUIDs के लिए 20 टक्कर से एक वास्तविक स्थिति में पैदा कर सकता है Muxa )।

function uuid() {
    function randomDigit() {
        if (crypto && crypto.getRandomValues) {
            var rands = new Uint8Array(1);
            crypto.getRandomValues(rands);
            return (rands[0] % 16).toString(16);
        } else {
            return ((Math.random() * 16) | 0).toString(16);
        }
    }
    var crypto = window.crypto || window.msCrypto;
    return 'xxxxxxxx-xxxx-4xxx-8xxx-xxxxxxxxxxxx'.replace(/x/g, randomDigit);
}

टिप्पणियाँ:

  • कोड की पठनीयता के लिए अनुकूलित गति नहीं, इसलिए कुछ सौ यूआईडी प्रति सेकंड के लिए उपयुक्त है। प्रदर्शन को मापने के लिए http://jsbin.com/fuwigo/1 का उपयोग करके मेरे लैपटॉप पर क्रोमियम में प्रति सेकंड लगभग 10000 यूआईडी () उत्पन्न करता है।
  • केवल "y" के लिए 8 का उपयोग करता है क्योंकि कोड पठनीयता को सरल करता है (y को 8, 9, ए या बी होने की अनुमति है)।

11

यदि आपको किसी विशेष प्रारूप में यादृच्छिक 128 बिट स्ट्रिंग की आवश्यकता है जिसका आप उपयोग कर सकते हैं:

function uuid() {
    return crypto.getRandomValues(new Uint32Array(4)).join('-');
}

जो कुछ इस तरह लौटेगा 2350143528-4164020887-938913176-2513998651


BTW, यह केवल संख्याएँ क्यों उत्पन्न करता है और वर्ण भी नहीं? बहुत कम सुरक्षित
vsync

1
आप इस तरह से अक्षर (अक्षर) भी जोड़ सकते हैं:Array.from((window.crypto || window.msCrypto).getRandomValues(new Uint32Array(4))).map(n => n.toString(16)).join('-')
magikMaker

11

सिर्फ दो उत्परिवर्तन के साथ एक और पठनीय संस्करण।

function uuid4()
{
  function hex (s, b)
  {
    return s +
      (b >>> 4   ).toString (16) +  // high nibble
      (b & 0b1111).toString (16);   // low nibble
  }

  let r = crypto.getRandomValues (new Uint8Array (16));

  r[6] = r[6] >>> 4 | 0b01000000; // Set type 4: 0100
  r[8] = r[8] >>> 3 | 0b10000000; // Set variant: 100

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

वैसे अधिकांश js dev वेब डेवलपर हैं, और हम समझ नहीं पाएंगे कि बिटवाइज़ ऑपरेटर्स क्या करते हैं, क्योंकि हम उन्हें विकसित नहीं करते हैं। वास्तव में मुझे उनमें से किसी की आवश्यकता नहीं थी, और मैं '97 के बाद से एक जेएस देव हूं। इसलिए आपका उदाहरण कोड अभी भी औसत वेब डेवलपर के लिए पूरी तरह से अपठनीय है जो इसे पढ़ेगा। यह उल्लेख करने के लिए कि आप अभी भी एकल अक्षर चर नामों का उपयोग करते हैं, जो इसे और भी अधिक गूढ़ बनाता है। शायद क्लीन कोड पढ़ा, शायद इससे मदद मिलती है: amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/…
inf3rno

@ inf3rno ने उसे नहीं छेड़ा, इस धागे में सभी प्रस्तावित समाधान गूढ़ हैं, लेकिन वे सही उत्तर हैं, इस प्रश्न पर विचार करते हुए कि एक प्रकार का एक लाइनर होना चाहिए। यही कारण है कि वन-लाइनर्स गुप्त हैं। वे औसत डेवलपर के लिए पठनीय होने का जोखिम नहीं उठा सकते हैं लेकिन वे स्क्रीन रियल एस्टेट को बचाते हैं जहां एक सरल पूर्ववर्ती टिप्पणी करेंगे। और इसके परिणामस्वरूप, इस तरह से अधिक पठनीय होने का अंत होता है, अगर इसके बजाय "पठनीय कोड" में होता।
tatsu

यादृच्छिक! = अद्वितीय
user1529413 14:13

@ user1529413 हाँ। विशिष्टता के लिए एक सूचकांक की आवश्यकता होती है।
ceving

यह मेरा पसंदीदा उत्तर है, क्योंकि यह 16-बाइट (128 बिट) मूल्य के रूप में एक यूयूआईडी का निर्माण कर रहा है, और इसके क्रमबद्ध, पढ़ने में अच्छा नहीं है। यह स्ट्रिंग सामान को छोड़ने के लिए मामूली रूप से आसान होगा और बस एक यादृच्छिक 128 बिट के सही बिट्स को सेट करना होगा, जो कि सभी uuidv4 होना चाहिए। आप इसे छोटे URL के लिए बेस 64 कर सकते हैं, इसे वापस कुछ वेबसैप्स पर पास कर सकते हैं, इसे एक मेमोरी में स्ट्रिंग की तुलना में कम स्टोर कर सकते हैं, इसे 4096-आकार का बफर बना सकते हैं और इसमें 256 uuids डाल सकते हैं, एक ब्राउज़र db में स्टोर कर सकते हैं, आदि। शुरू से ही लंबे, छोटे-छोटे षड़यन्त्र स्ट्रिंग के रूप में सब कुछ होने से।
क़ारीबौ से जोश

8

ठीक है, uuid पैकेज का उपयोग करते हुए , यह संस्करण 1, 3, 4 और 5 UUIDs के लिए समर्थन करता है:

yarn add uuid

और फिर:

const uuidv1 = require('uuid/v1');
uuidv1(); // ⇨ '45745c60-7b1a-11e8-9c9c-2d42b21b1a3e'

आप इसे पूरी तरह से निर्दिष्ट विकल्पों के साथ भी कर सकते हैं:

const v1options = {
  node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
  clockseq: 0x1234,
  msecs: new Date('2011-11-01').getTime(),
  nsecs: 5678
};
uuidv1(v1options); // ⇨ '710b962e-041c-11e1-9234-0123456789ab'

अधिक जानकारी के लिए, यहाँ npm पेज पर जाएँ


6

यह महत्वपूर्ण है कि अच्छी तरह से परीक्षण किए गए कोड का उपयोग करें जो इसके लिए अपना स्वयं का सामान भरने के बजाय 1 से अधिक योगदानकर्ताओं द्वारा बनाए रखा गया है। यह उन जगहों में से एक है जहाँ आप शायद सबसे कम संभव चतुर संस्करण की तुलना में सबसे अधिक स्थिर कोड पसंद करना चाहते हैं जो एक्स ब्राउज़र में काम करता है, लेकिन वाई की मूर्तियों को ध्यान में नहीं रखता है, जो कि कई बार बग़ल में प्रकट होने की तुलना में बग की जांच करने के लिए बहुत मुश्किल होता है। कुछ उपयोगकर्ताओं के लिए। व्यक्तिगत रूप से मैं https://github.com/aurigadl/uuid-js पर uuid-js का उपयोग करता हूं जो कि bower सक्षम करता है ताकि मैं आसानी से अपडेट ले सकूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.