क्या GUID अद्वितीय 100% समय है?
क्या यह कई धागों पर अद्वितीय रहेगा?
क्या GUID अद्वितीय 100% समय है?
क्या यह कई धागों पर अद्वितीय रहेगा?
जवाबों:
जबकि प्रत्येक उत्पन्न GUID को विशिष्ट होने की गारंटी नहीं है, कुल कुंजियों की अद्वितीय संख्या (2 128 या 3.4 × 10 38 ) इतनी बड़ी है कि एक ही संख्या के दो बार उत्पन्न होने की संभावना बहुत कम है। उदाहरण के लिए, अवलोकन योग्य ब्रह्मांड पर विचार करें, जिसमें लगभग 5 × 10 22 सितारे हैं; प्रत्येक तारा तब 6.8 × 10 15 सार्वभौमिक रूप से अद्वितीय GUID हो सकता था।
से विकिपीडिया ।
ये कुछ अच्छे लेख हैं कि GUID कैसे बनाया जाता है (.NET के लिए) और कैसे आप एक ही गाइड को सही स्थिति में प्राप्त कर सकते हैं।
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
2^128
बाहर लिखा लगभग है 34,028,236,692,093,846,346,337,460,743,177,000,000
:। सांख्यिकीय रूप से, यदि आप हर सेकंड 1000 GUID की गणना करते हैं, तो एक डुप्लिकेट प्राप्त करने में अभी भी खरबों साल लगेंगे।
यदि आप समान GUID मानों से डरते हैं तो उनमें से दो को एक दूसरे के बगल में रखें।
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
अगर आप बहुत ज्यादा पागल हैं तो तीन डाल दें।
999999999
आपके रूप में, मुझे लगता है कि व्यामोह मेरे ब्राउज़र को एक अलग कर देगा।
सरल उत्तर है हां।
रेमंड चेन ने GUIDs पर एक शानदार लेख लिखा था और GUIDs के सबस्ट्रिंग की गारंटी अद्वितीय क्यों नहीं है । जिस तरह से GUID उत्पन्न होते हैं और जिस डेटा का उपयोग वे विशिष्टता को सुनिश्चित करने के लिए करते हैं, लेख कुछ गहराई तक जाता है, जो यह बताने के लिए कुछ लंबाई में जाना चाहिए कि वे :-) क्यों हैं?
एक साइड नोट के रूप में, मैं Windows XP में वॉल्यूम GUIDs के साथ खेल रहा था। यह एक बहुत ही अस्पष्ट विभाजन लेआउट है जिसमें तीन डिस्क और चौदह खंड हैं।
\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
| | | | |
| | | | +-- 6f = o
| | | +---- 69 = i
| | +------ 72 = r
| +-------- 61 = a
+---------- 6d = m
ऐसा नहीं है कि GUID बहुत समान हैं लेकिन यह तथ्य कि सभी GUID में स्ट्रिंग "mario" है। क्या यह संयोग है या इसके पीछे कोई स्पष्टीकरण है?
अब, जब GUID में भाग 4 के लिए googling मैंने वॉल्यूम GUID के साथ लगभग 125.000 हिट पाया।
निष्कर्ष: जब वॉल्यूम GUID की बात आती है तो वे अन्य GUID की तरह अद्वितीय नहीं होते हैं।
msiexec
, तो यह कार्यालय के सभी MSI GUID को सूचीबद्ध करता है। वे सभी जादू करते हैं 0FF1CE
। Microsoft की तरह लगता है एक बहुत ... ढीला ... कैसे एक GUID उत्पन्न करने के लिए व्याख्या;)
0FF1CE
GUIDs RFC-4122 के "NCS पीछे की ओर संगतता" खंड के अंतर्गत आते हैं, लेकिन यह संभावना नहीं है कि Microsoft उन मूल्यों के लिए NCS नियमों का पालन कर रहा है।
ऐसा नहीं होना चाहिए। हालांकि, जब .NET भारी भार के अधीन होता है, तो डुप्लिकेट गार्ड प्राप्त करना संभव है। मेरे पास दो अलग-अलग sql सर्वरों का उपयोग करके दो अलग-अलग वेब सर्वर हैं। मैं डेटा को मर्ज करने गया और मैंने पाया कि मेरे पास 15 मिलियन और 7 डुप्लिकेट थे।
Guid.NewGuid
हमेशा v4 GUIDs उत्पन्न करता है (और हमेशा होता है)। टिम के पास बेहद खराब एंट्रोपी स्रोत होने चाहिए थे।
हां, एक GUID हमेशा अद्वितीय होना चाहिए। यह हार्डवेयर और समय दोनों पर आधारित है, साथ ही यह सुनिश्चित करने के लिए कुछ अतिरिक्त बिट्स भी है कि यह अद्वितीय है। मुझे यकीन है कि यह दो समान लोगों के साथ समाप्त होने के लिए सैद्धांतिक रूप से संभव है, लेकिन वास्तविक दुनिया के परिदृश्य में बेहद संभावना नहीं है।
यहाँ रेमंड चेन पर एक महान लेख है:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
गाइड सांख्यिकीय रूप से अद्वितीय हैं। एक ही गाइड जेनरेट करने वाले दो अलग-अलग क्लाइंट्स के अंतर असीम रूप से छोटे होते हैं (गाइड जेनरेशन कोड में कोई बग नहीं)। आप एक ब्रह्मांडीय किरण के कारण अपने प्रोसेसर के गड़बड़ होने की चिंता कर सकते हैं और आज उस 2 + 2 = 5 को तय कर सकते हैं।
नए गाइड आवंटित करने वाले कई थ्रेड्स को अद्वितीय मान मिलेंगे, लेकिन आपको यह प्राप्त करना चाहिए कि जिस फ़ंक्शन को आप कॉल कर रहे हैं वह थ्रेड सुरक्षित है। यह किस माहौल में है?
एरिक लिपर्ट ने GUID के बारे में लेखों की एक बहुत ही रोचक श्रृंखला लिखी है।
दुनिया में ऑर्डर 2 30 व्यक्तिगत कंप्यूटर हैं (और निश्चित रूप से बहुत सारे हाथ से पकड़े गए डिवाइस या गैर-पीसी कंप्यूटिंग डिवाइस हैं जिनके पास कंप्यूटिंग शक्ति के समान या कम स्तर हैं, लेकिन उन पर ध्यान नहीं देते हैं)। मान लेते हैं कि हमने दुनिया के उन सभी पीसी को GUID बनाने के कार्य में लगा दिया; यदि प्रत्येक व्यक्ति प्रति सेकंड 2 20 GUID उत्पन्न कर सकता है, तो केवल 2 72 सेकंड के बाद - एक सौ और पचास ट्रिलियन वर्ष - आपके पास अपने विशिष्ट GUID के साथ टकराव उत्पन्न करने का एक बहुत ही उच्च मौका होगा। और टकराव की संभावना केवल तीस खरब वर्षों के बाद बहुत अच्छी हो जाती है।
सैद्धांतिक रूप से, नहीं, वे अद्वितीय नहीं हैं। बार-बार एक समान गाइड उत्पन्न करना संभव है। हालांकि, इसके होने की संभावना इतनी कम है कि आप मान सकते हैं कि वे अद्वितीय हैं।
मैंने पहले पढ़ा है कि संभावना इतनी कम है कि आपको वास्तव में किसी और चीज़ के बारे में तनाव देना चाहिए - जैसे कि आपका सर्वर अनायास आपके कोड में दहन या अन्य कीड़े। यही है, मान लें कि यह अद्वितीय है और डुप्लिकेट को "पकड़ने" के लिए किसी भी कोड में निर्मित नहीं होता है - अपना समय कुछ और होने की संभावना (यानी कुछ भी) पर खर्च करें ।
मैंने अपने ब्लॉग दर्शकों (गैर-तकनीकी पारिवारिक मेमोरियल) के लिए GUID की उपयोगिता का वर्णन करने का प्रयास किया। वहाँ से (विकिपीडिया के माध्यम से), एक डुप्लिकेट GUID बनाने की संभावना:
किसी को भी इसके होने की संभावना के वास्तविक गणित का उल्लेख नहीं लगता है।
पहले, मान लें कि हम पूरे 128 बिट स्पेस का उपयोग कर सकते हैं (गाइड v4 केवल 122 बिट्स का उपयोग करता है)।
हम जानते हैं कि n
पिक्स में डुप्लिकेट नहीं होने की सामान्य संभावना है:
(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (एन -1) / 2 128 )
क्योंकि 2 128 की तुलना में बहुत अधिक है n
, हम इसको अनुमानित कर सकते हैं:
(1-1 / 2 128 ) एन (एन -1) / 2
और क्योंकि हम मान सकते हैं n
कि 0 की तुलना में बहुत बड़ा है, हम इसे अनुमानित कर सकते हैं:
(1-1 / 2 128 ) n ^ 2/2
अब हम इसे "स्वीकार्य" संभावना के बराबर कर सकते हैं, आइए 1% कहते हैं:
(1-1 / 2 128 ) n ^ 2/2 = 0.01
जिसे हम हल करते हैं n
और प्राप्त करते हैं:
n = sqrt (2 * लॉग 0.01 / लॉग (1-1 / 2 128 ))
कौन सा वोल्फ्राम अल्फा 5.598318 × 10 19 का हो जाता है
उस संख्या को परिप्रेक्ष्य में रखने के लिए, 10000 मशीनें लेने की सुविधा देता है, जिनमें से प्रत्येक में 4 कोर सीपीयू होता है, 4Ghz कर रहा है और 10000 साइकिल खर्च कर एक गाइड उत्पन्न करता है और कुछ नहीं करता है। इसके बाद वे एक डुप्लिकेट उत्पन्न करने से पहले ~ 111 साल लगेंगे।
से http://www.guidgenerator.com/online-guid-generator.aspx
एक GUID क्या है?
GUID (या UUID) 'ग्लोबली यूनिक आइडेंटिफायर' (या 'यूनिवर्सली यूनिक आइडेंटिफायर') के लिए एक संक्षिप्त नाम है। यह एक 128-बिट पूर्णांक संख्या है जिसका उपयोग संसाधनों की पहचान करने के लिए किया जाता है। GUID शब्द का उपयोग आमतौर पर Microsoft तकनीकों के साथ काम करने वाले डेवलपर्स द्वारा किया जाता है, जबकि UUID का उपयोग हर जगह किया जाता है।
GUID कितना अनोखा है?
128-बिट्स काफी बड़ी है और जेनरेशन का एल्गोरिदम इतना अनोखा है कि अगर 1 साल के लिए 1,000,000,000 GUIDs प्रति वर्ष उत्पन्न होते हैं तो एक डुप्लिकेट की संभावना केवल 50% होगी। या यदि पृथ्वी पर प्रत्येक मानव 600,000,000 GUID उत्पन्न करता है तो केवल एक डुप्लिकेट की 50% संभावना होगी।
मुझे एक डुप्लिकेट GUID का अनुभव हुआ।
मैं Neat Receipts डेस्कटॉप स्कैनर का उपयोग करता हूं और यह मालिकाना डेटाबेस सॉफ्टवेयर के साथ आता है। सॉफ़्टवेयर में क्लाउड सुविधा के लिए एक सिंक है, और मैं सिंक करने पर एक त्रुटि प्राप्त करता रहा। लॉग में एक गैंडर ने भयानक लाइन का खुलासा किया:
"त्रुटियां": [{"कोड": 1, "संदेश": "creator_guid: पहले से ही लिया गया है", "गाइड": "C83E5734-D77A-4B09-B8C1-9623C7B167"}}]
मैं अविश्वास में था, लेकिन निश्चित रूप से पर्याप्त था, जब मैंने अपने स्थानीय नीटवर्क डेटाबेस में एक रास्ता ढूंढा और उस GUID वाले रिकॉर्ड को हटा दिया, तो त्रुटि उत्पन्न होना बंद हो गई।
तो उपाख्यानात्मक प्रमाण के साथ अपने प्रश्न का उत्तर देने के लिए, नहीं। एक डुप्लिकेट संभव है। लेकिन यह संभावना है कि ऐसा होने का कारण मौका नहीं था, लेकिन मानक अभ्यास के कारण किसी तरह से पालन नहीं किया जा रहा है। (मैं सिर्फ इतना भाग्यशाली नहीं हूं) हालांकि, मैं निश्चित रूप से नहीं कह सकता। यह मेरा सॉफ्टवेयर नहीं है।
उनका ग्राहक समर्थन बेहद विनम्र और मददगार था, लेकिन उन्हें पहले कभी इस मुद्दे का सामना नहीं करना पड़ा, क्योंकि उनके साथ फोन पर 3+ घंटों के बाद, उन्हें समाधान नहीं मिला। (एफडब्ल्यूआईडब्ल्यू, मैं नीट से बहुत प्रभावित हूं, और यह गड़बड़ है, हालांकि निराशा होती है, लेकिन उनके उत्पाद के बारे में मेरी राय नहीं बदली।)
MSDN :
इस बात की बहुत कम संभावना है कि नए गाइड का मूल्य सभी शून्य या किसी अन्य गाइड के बराबर हो।
यदि आपकी सिस्टम घड़ी ठीक से सेट है और चारों ओर लिपटी नहीं है, और यदि आपके एनआईसी के पास अपना स्वयं का मैक है (यानी आपने एक कस्टम मैक सेट नहीं किया है) और आपका एनआईसी विक्रेता एमएसीएस का पुनर्चक्रण नहीं कर रहा है (जो वे करने वाले नहीं हैं लेकिन जिसे होने के लिए जाना जाता है), और यदि आपके सिस्टम का GUID पीढ़ी फ़ंक्शन ठीक से कार्यान्वित होता है, तो आपका सिस्टम कभी भी डुप्लिकेट GUID नहीं बनाएगा।
यदि GUID उत्पन्न करने वाली पृथ्वी पर सभी लोग उन नियमों का पालन करते हैं तो आपके GUIDs विश्व स्तर पर अद्वितीय होंगे।
व्यवहार में, नियम तोड़ने वालों की संख्या कम है, और उनके GUID के "भागने" की संभावना नहीं है। संघर्ष सांख्यिकीय रूप से अनुचित हैं।
क्या GUID अद्वितीय 100% समय है?
गारंटी नहीं है, क्योंकि एक उत्पन्न करने के कई तरीके हैं। हालांकि, आप दो GUID बनाने की संभावना की गणना करने का प्रयास कर सकते हैं जो समान हैं और आपको यह विचार मिलता है: एक GUID में 128 बिट्स हैं, इसलिए, 2 128 अलग GUID हैं - ज्ञात ब्रह्मांड में सितारों की तुलना में बहुत अधिक हैं। अधिक जानकारी के लिए विकिपीडिया लेख पढ़ें ।
अधिक सामान्य अर्थों में, इसे "जन्मदिन की समस्या" या "जन्मदिन विरोधाभास" के रूप में जाना जाता है। विकिपीडिया पर एक बहुत अच्छा अवलोकन है: विकिपीडिया - जन्मदिन समस्या
बहुत ही मोटे शब्दों में, पूल के आकार का वर्गमूल एक मोटा अंदाजा है जब आप डुप्लिकेट के 50% संभावना की उम्मीद कर सकते हैं। लेख में 2 ^ 128 की पंक्ति सहित पूल आकार और विभिन्न संभावनाओं की एक संभाव्यता तालिका शामिल है। तो टक्कर की 1% संभावना के लिए आप बेतरतीब ढंग से 2.6 * 10 ^ 18 128-बिट संख्या लेने की उम्मीद करेंगे। 50% संभावना के लिए 2.2 * 10 ^ 19 पिकेट की आवश्यकता होती है, जबकि SQRT (2 ^ 128) 1.8 * 10 ^ 19 है।
बेशक, यह वास्तव में यादृच्छिक प्रक्रिया का आदर्श मामला है। जैसा कि दूसरों ने उल्लेख किया है, बहुत कुछ उस यादृच्छिक पहलू पर है - बस जनरेटर और बीज कितना अच्छा है? यह अच्छा होगा यदि इस प्रक्रिया में सहायता के लिए कुछ हार्डवेयर समर्थन है जो अधिक बुलेट-प्रूफ होगा, सिवाय इसके कि कुछ भी खराब हो सकता है या वर्चुअलाइज्ड हो सकता है। मुझे संदेह है कि यही कारण हो सकता है कि मैक एड्रेस / टाइम-स्टैम्प अब शामिल नहीं हैं।
अधिक बेहतर परिणाम के लिए सबसे अच्छा तरीका है GUID को टाइमस्टैम्प के साथ जोड़ना (बस यह सुनिश्चित करने के लिए कि यह अद्वितीय रहता है)
Guid.NewGuid().ToString() + DateTime.Now.ToString();
GUID एल्गोरिदम आमतौर पर v4 GUID विनिर्देशन के अनुसार कार्यान्वित किए जाते हैं, जो अनिवार्य रूप से एक छद्म यादृच्छिक स्ट्रिंग है। अफसोस की बात है, ये "गैर-अद्वितीय" की श्रेणी में आते हैं विकिपीडिया से (मुझे नहीं पता कि इतने सारे लोग इस बिट को क्यों अनदेखा करते हैं): "... अन्य GUID संस्करणों में विशिष्ट विशिष्टता गुण और संभावनाएं हैं, गारंटी विशिष्टता से लेकर गैर-विशिष्टता की संभावना के लिए। "
V8 के जावास्क्रिप्ट के छद्म-यादृच्छिक गुण Math.random()
विशिष्टता में हैं, टकराव अक्सर कुछ हज़ार पुनरावृत्तियों के बाद आते हैं, लेकिन V8 एकमात्र अपराधी नहीं है। मैंने PHP और Ruby दोनों v4 GUID के कार्यान्वयन का उपयोग करके वास्तविक-विश्व GUID टकराव देखा है।
क्योंकि यह एक से अधिक क्लाइंट में ID जनरेशन स्केल करने के लिए अधिक से अधिक आम होता जा रहा है, और सर्वर के क्लस्टर, एन्ट्रापी एक बड़ी हिट लेता है - एक ही रैंडम बीज की संभावना को एक आईडी एस्केलेट उत्पन्न करने के लिए इस्तेमाल किया जा रहा है (समय अक्सर एक यादृच्छिक बीज के रूप में उपयोग किया जाता है छद्म यादृच्छिक जनरेटर में), और GUID टकराव "संभावित गैर-अद्वितीय" से "बहुत परेशानी पैदा करने की संभावना" से बढ़ जाते हैं।
इस समस्या को हल करने के लिए, मैं एक आईडी एल्गोरिथ्म बनाने के लिए तैयार हूं जो सुरक्षित रूप से स्केल कर सकता है, और टक्कर के खिलाफ बेहतर गारंटी देता है। यह टाइमस्टैम्प, इन-मेमोरी क्लाइंट काउंटर, क्लाइंट फ़िंगरप्रिंट और यादृच्छिक वर्णों का उपयोग करके ऐसा करता है। कारकों का संयोजन एक additive जटिलता बनाता है जो टकराव के लिए विशेष रूप से प्रतिरोधी है, भले ही आप इसे कई मेजबानों के पैमाने पर रखते हैं:
मैंने बहु-थ्रेडेड / मल्टी-प्रोसेस यूनिट-टेस्टिंग (भी?) के दौरान GUID को अद्वितीय नहीं होने का अनुभव किया है। मुझे लगता है कि छद्म यादृच्छिक क्रांतिकारियों के समान, सभी अन्य टिंग समान होने चाहिए, समान बीजारोपण (या बोने की कमी)। मैं इसका उपयोग अद्वितीय फ़ाइल नाम बनाने के लिए कर रहा था। मैंने पाया कि OS ऐसा करने में बहुत बेहतर है :)
आप पूछते हैं कि क्या GUID 100% अद्वितीय हैं। यह GUIDs की संख्या पर निर्भर करता है, यह अद्वितीय होना चाहिए। GUIDs की संख्या अनंत के करीब होने के कारण, GUID की नकल की संभावना 100% तक पहुंच जाती है।
का जवाब "एक GUID 100% अद्वितीय है है?" बस "नहीं" है ।
यदि आप GUID की 100% विशिष्टता चाहते हैं तो निम्नलिखित करें।
सबसे कठिन हिस्सा एक डुप्लिकेट किए गए दिशानिर्देश को बनाने के बारे में नहीं है।
सबसे कठिन हिस्सा एक डेटाबेस को डिज़ाइन किया गया है ताकि सभी जनरेट किए जा सकें कि यह वास्तव में डुप्लिकेट है या नहीं।
विकी से:
उदाहरण के लिए, यादृच्छिक संस्करण 4 यूयूआईडी की संख्या, जिसे कम से कम एक टकराव की 50% संभावना होने के लिए उत्पन्न करने की आवश्यकता है, निम्नानुसार गणना की गई 2.71 क्विंटल है:
यह संख्या लगभग 85 वर्षों के लिए 1 बिलियन यूयूआईडी प्रति सेकंड उत्पन्न करने के बराबर है, और इस फाइल में कई यूयूआईडी हैं, 16 बाइट्स प्रति यूयूआईडी के साथ, लगभग 45 एक्साबाइट्स होंगे, जो वर्तमान में अस्तित्व में सबसे बड़े डेटाबेस से कई गुना बड़ा है, जो चालू हैं सैकड़ों पेटाबाइट्स का क्रम
वैश्विक विशिष्ट पहचान के लिए GUID खड़ा
संक्षेप में: (नाम में सुराग है)
विस्तार से: GUID को अद्वितीय होने के लिए डिज़ाइन किया गया है; उनकी गणना कंप्यूटर घड़ी और कंप्यूटर के आधार पर एक यादृच्छिक विधि से की जाती है, यदि आप एक ही मशीन पर एक ही मिलीसेकंड पर कई GUID बना रहे हैं तो यह संभव है कि वे मेल खा सकें लेकिन लगभग सभी सामान्य ऑपरेशनों के लिए उन्हें अद्वितीय माना जाना चाहिए।