जब आप वास्तव में डिज़ाइन के भाग के रूप में UUID का उपयोग करने के लिए मजबूर होते हैं?


123

मैं वास्तव में UUID की बात नहीं देखता । मुझे पता है कि टक्कर की संभावना प्रभावी रूप से शून्य है , लेकिन प्रभावी रूप से शून्य भी असंभव के करीब नहीं है।

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

UUID मुझे वैश्विक चर की तरह खुशबू आ रही है। कई तरीके हैं जो वैश्विक चर सरल डिजाइन के लिए बनाते हैं, लेकिन यह सिर्फ आलसी डिजाइन है।


23
हर चीज में असफलता की संभावना शून्य होती है। मैं UUIDs की टक्कर की तुलना में समस्याओं के होने की संभावना पर अधिक ध्यान केंद्रित करूँगा (अर्थात लगभग कुछ भी जो आप सोच सकते हैं)
DanSingerman

16
दरअसल, "प्रभावी रूप से नील" असंभव के बहुत करीब है।
mqp

21
नहींं, यह वास्तव में असीम रूप से असंभव से बहुत दूर है
Pyrolutic

32
@ जब आप "इन्फिनिटी" जैसे शब्दों को फेंकना शुरू करते हैं, तो आपने सॉफ्टवेयर विकास की दुनिया छोड़ दी है। कंप्यूटर विज्ञान सिद्धांत वास्तविक सॉफ्टवेयर लिखने की तुलना में एक पूरी तरह से अलग चर्चा है।
रेक्स एम

2
मैं ज्यादातर बंद कर दूंगा क्योंकि git के sha1 ने मुझे हैश की अच्छाई के बारे में आश्वस्त कर दिया है
PyrolICAL

जवाबों:


617

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

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

संस्करण 5 और संस्करण 3 यूयूआईडी क्रमशः यूएआईडी उत्पन्न करने के लिए पहले से ही अनूठे डेटा के एक टुकड़े के साथ एक नाम स्थान को संयोजित करने के लिए SHA1 और MD5 हैश फ़ंक्शन का उपयोग करते हैं। उदाहरण के लिए, यह आपको URL से UUID बनाने की अनुमति देगा। यहां टक्कर केवल तभी संभव है जब अंतर्निहित हैश फ़ंक्शन में एक टक्कर भी हो।

संस्करण 1 यूयूआईडी सबसे आम हैं। वे नेटवर्क कार्ड के मैक पते का उपयोग करते हैं (जो कि जब तक खराब न हो, अद्वितीय होना चाहिए), प्लस टाइमस्टैम्प, प्लस यूयूआईडी उत्पन्न करने के लिए सामान्य बिट-ट्विडलिंग। ऐसी मशीन के मामले में जिसमें मैक एड्रेस नहीं है, 6 नोड बाइट्स क्रिप्टोग्राफिक रूप से सुरक्षित यादृच्छिक संख्या जनरेटर के साथ उत्पन्न होते हैं। यदि दो UUIDs इतनी तेजी से अनुक्रम में उत्पन्न होते हैं कि टाइमस्टैम्प पिछले UUID से मेल खाता है, तो टाइमस्टैम्प 1 से बढ़ जाता है। जब तक कि निम्न में से एक नहीं होता है तब तक टकराव नहीं होना चाहिए: मैक एड्रेस खराब हो गया है; दो अलग-अलग यूयूआईडी जनरेटिंग एप्लिकेशन चलाने वाली एक मशीन ठीक उसी क्षण यूयूआईडी बनाती है; एक नेटवर्क कार्ड के बिना या मैक पते के उपयोगकर्ता स्तर तक पहुंच के बिना दो मशीनों को एक ही यादृच्छिक नोड अनुक्रम दिया जाता है, और ठीक उसी क्षण में यूयूआईडी उत्पन्न करते हैं;

वास्तविक रूप से, इनमें से कोई भी घटना एक आवेदन की आईडी स्थान के भीतर दुर्घटना से नहीं होती है। जब तक आप आईडी को स्वीकार नहीं कर रहे हैं, तब तक, एक इंटरनेट-वाइड स्केल, या एक अविश्वसनीय वातावरण के साथ जहां दुर्भावनापूर्ण व्यक्ति आईडी की टक्कर के मामले में कुछ बुरा करने में सक्षम हो सकते हैं, यह सिर्फ कुछ ऐसा नहीं है जिसके बारे में आपको चिंता करनी चाहिए। यह समझना महत्वपूर्ण है कि यदि आप एक ही संस्करण 4 यूयूआईडी उत्पन्न करते हैं जैसा कि मैं करता हूं, ज्यादातर मामलों में, यह कोई फर्क नहीं पड़ता। मैंने आईडी को आपसे पूरी तरह से अलग आईडी स्पेस में जेनरेट किया है। मेरे आवेदन को टकराव के बारे में कभी पता नहीं चलेगा इसलिए टक्कर कोई मायने नहीं रखती। स्पष्ट रूप से, दुर्भावनापूर्ण अभिनेताओं के बिना एक एकल अनुप्रयोग स्थान में, पृथ्वी पर सभी जीवन का विलुप्त होने से बहुत पहले ही आपको टक्कर मिल जाएगी, यहां तक ​​कि एक संस्करण 4 यूयूआईडी पर, भले ही आप '

इसके अलावा, 2 ^ 64 * 16 256 एक्साबाइट है। जैसा कि, आपको एक अनुप्रयोग स्थान में ID टक्कर के 50% संभावना होने से पहले आपको आईडी के लायक 256 एक्सबायट स्टोर करने की आवश्यकता होगी।


8
यह अब तक का सबसे अच्छा स्पष्टीकरण है। मुझे नहीं पता कि यह शीर्ष पर मतदान क्यों नहीं किया जा रहा है। कुडोस टू स्पोर्कमॉन्गर।
ब्रैड बार्कर

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

1
@Chamnap uuid.rawआपको बाइट स्ट्रिंग देगा। hashविधि आप के लिए उपयोगी नहीं है। इसका उपयोग रूबी के भीतर हैश टेबल और तुलनात्मक संचालन के लिए किया जाता है। विभिन्न यूयूआईडी अभ्यावेदन से परिवर्तित करने के लिए सभी विधियों को वर्ग विधियों के रूप में परिभाषित किया गया है और इसके साथ उपसर्ग किया जाना चाहिए "parse"
बॉब अमन

3
1990 में @busAman मैं एजिस सिस्टम पर 12 UUID टकराव हुआ, एक दोषपूर्ण FPU निकला, लेकिन मुझे लगा कि मैं आपको बता दूंगा कि ऐसा हो सकता है (प्रोग्रामिंग के पिछले 30+ वर्षों में इसके अलावा और कुछ नहीं हुआ है) । अच्छी व्याख्या, बहुत btw, यह अब मेरी
defacto

2
@kqr आप बिल्कुल सही कह रहे हैं कि यह जन्मदिन की समस्या है, हालाँकि n-bit कोड के लिए, जन्मदिन विरोधाभास समस्या 2 ^ (n / 2) तक कम हो जाती है, जो इस मामले में 2 ^ 64 है, जैसा कि मेरे उत्तर में कहा गया है ।
बॉब अमन

69

UUIDs जो चीज़ आप खरीदते हैं, वह करना बहुत मुश्किल होता है, क्योंकि किसी केंद्रीय प्राधिकरण के साथ परामर्श या समन्वय किए बिना एक अद्वितीय पहचानकर्ता प्राप्त करना है । UUIDs हल समस्या के बिना किसी तरह के प्रबंधित बुनियादी ढांचे के बिना इस तरह की चीज प्राप्त करने की सामान्य समस्या है।

मैंने पढ़ा है कि जन्मदिन के विरोधाभास के अनुसार एक UUID टकराव की संभावना 50% है एक बार 2 ^ 64 UUIDs उत्पन्न हो गए हैं। अब 2 ^ 64 एक बहुत बड़ी संख्या है, लेकिन टक्कर का 50% मौका बहुत अधिक जोखिम भरा लगता है (उदाहरण के लिए, 5% टक्कर की संभावना होने से पहले कितने यूयूआईडी मौजूद होने की आवश्यकता है - यहां तक ​​कि संभावना का बहुत बड़ा जैसा लगता है) ।

उस विश्लेषण के साथ समस्या दुगुनी है:

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

  2. कड़ाई से बोलते हुए, यूयूआईडी को केवल अन्य यूयूआईडी के सेट के बीच अद्वितीय होने की आवश्यकता होती है, जिसकी तुलना उनके खिलाफ की जा सकती है। यदि आप डेटाबेस कुंजी के रूप में उपयोग करने के लिए एक UUID उत्पन्न कर रहे हैं, तो इससे कोई फर्क नहीं पड़ता कि कहीं और एक दुष्ट वैकल्पिक ब्रह्मांड में है कि COM इंटरफ़ेस की पहचान करने के लिए उसी UUID का उपयोग किया जा रहा है। जैसे यह कोई भ्रम नहीं होगा अगर कोई है (या कुछ और) अल्फा-सेंटौरी पर "माइकल बूर" नाम दिया गया है।


1
ठोस उदाहरण? COM / DCE UUIDs - उन्हें असाइन करने का कोई अधिकार नहीं है, और कोई भी ज़िम्मेदारी नहीं लेना चाहता था और / या कोई भी ऐसा नहीं चाहता था कि कोई प्राधिकरण हो। वितरित डेटाबेस जिनके पास विश्वसनीय लिंक नहीं हैं और कोई मास्टर नहीं है।
माइकल बूर

3
अधिक ठोस उदाहरण - एक बैंकिंग अनुप्रयोग। यह एक से अधिक डेटा केंद्र, प्रत्येक देश के लिए, प्रत्येक डेटा केंद्र में एक DB है। विभिन्न नियमों का पालन करने के लिए कई प्रतिष्ठान हैं। हर ग्राहक के लिए पूरे सेट में केवल एक ग्राहक का रिकॉर्ड हो सकता है .....
विनीत रेनॉल्ड्स

(पिछली टिप्पणी की निरंतरता) आपके पास समग्र रिपोर्टिंग और ट्रैकिंग उद्देश्यों (सभी स्थापनाओं के लिए) के लिए ग्राहक आईडी बनाने के लिए एक केंद्रीय सर्वर होना चाहिए या अलग-अलग संस्थापनाएं ग्राहक आईडी के रूप में सेवा करने के लिए UUIDs उत्पन्न करती हैं (जाहिर है कि UUIDs का उपयोग नहीं किया जा सकता है) रिपोर्ट में)।
विनीत रेनॉल्ड्स

जब तक आपको नकल का 50% मौका मिलता है, तब तक आप पहले ही डूब चुके होते हैं। कोई व्यक्ति 0.0000001% मौका प्राप्त करने के लिए आवश्यक मात्रा को इंगित करता है। हर बार 1 से n तक और कई बार बढ़ने पर कई ऑटो-इन्क्रिमेंट डेटाबेस समान समस्या को प्रभावी ढंग से हल करते हैं।
गॉर्डन 21

2
डुप्लिकेट प्राप्त करने की
संभावनाएं

33

हर चीज में असफलता की संभावना शून्य होती है। मैं UUIDs की टक्कर की तुलना में समस्याओं के होने की संभावना (यानी लगभग कुछ भी आप के बारे में सोच सकते हैं) पर ध्यान केंद्रित करेगा


प्योरोलिटिक के अनुरोध पर एक उत्तर के रूप में जोड़ा गया
DanSingerman

16

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

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


उपाय। आलसी मत बनो और संदर्भ अद्यतन करें। सही से करो।
प्योरोलॉजिकल

8
इसका आलसीपन से कोई लेना-देना नहीं है - यदि नीति यह है कि किसी आइटम के लिए एक आईडी को स्थायी और अपरिवर्तनीय माना जाता है, तो आईडी बदल जाती है। इसलिए आप चाहते हैं कि आईडी शुरू से ही विशिष्ट हो, और आप चाहते हैं कि शुरू से ही सभी प्रणालियों को किसी न किसी तरह से जोड़ने की आवश्यकता हो।
माइकल बूर 21

आपको संदर्भ की आवश्यकता है। यदि आपके पास अद्वितीय आईडी के दो समूह हैं जो संघर्ष कर सकते हैं, तो आपको उन्हें अलग करने के लिए उच्च स्तर के संदर्भ की आवश्यकता है
Pyrolutic

23
या, आप केवल UUIDs का उपयोग करने और इसे शिप करने, इसे बेचने, एक मिलियन डॉलर बनाने और कभी एक भी शिकायत सुनने के लिए सिस्टम का निर्माण नहीं कर सकते हैं कि दो आईडी टकरा गए क्योंकि ऐसा नहीं होगा।
रेक्स एम

16

UUID बनाने के लिए यह बिल्कुल आवश्यक नहीं है। हालाँकि यह एक मानक है जहाँ ऑफ़लाइन होना सुविधाजनक है उपयोगकर्ता टक्कर की बहुत कम संभावना के साथ किसी चीज़ की कुंजी उत्पन्न कर सकते हैं।

यह डेटाबेस प्रतिकृति संकल्प आदि में सहायता कर सकता है ...

यह ऑनलाइन के लिए आसान होगा उपयोगकर्ताओं के लिए ओवरहेड या टक्कर की संभावना के बिना किसी चीज़ के लिए अद्वितीय कुंजी उत्पन्न , लेकिन यूयूआईडी के लिए ऐसा नहीं है।

वैसे भी, टकराव की संभावना पर एक शब्द, विकिपीडिया से लिया गया:

इन नंबरों को परिप्रेक्ष्य में रखने के लिए, एक उल्कापिंड की चपेट में आने का सालाना जोखिम 17 बिलियन में एक मौका होने का अनुमान है, जो एक वर्ष में कुछ यूयूआईडीएस के दसियों ट्रिलियन बनाने और एक डुप्लिकेट होने के बाधाओं के बराबर है। दूसरे शब्दों में, अगले 100 वर्षों के लिए हर सेकंड 1 बिलियन यूयूआईडी बनाने के बाद, केवल एक डुप्लिकेट बनाने की संभावना लगभग 50% होगी।


4
सरल, ऑफ़लाइन उपयोगकर्ताओं को कुंजियाँ न दें। सिस्टम को ऑनलाइन होने तक अस्थायी कुंजी सौंपी जाए ताकि असली कुंजी उत्पन्न हो सके।
प्योरोलॉजिकल

यह मेरी राय में एक बहुत ही उपयोगी उत्तर है ... संभावना को अपने आप में किसी प्रकार की समानता की पेशकश करने जा रहा था, जैसा कि ऐसा लग रहा था कि ओपी ने इसका अर्थ समझ नहीं पाया था, लेकिन आप ऐसा कर रहे हैं।
नोल्डोरिन

मैं समझती हूं कि संभावना प्रभावी रूप से शून्य है। मेरे लिए
यूयूआईडी

यह काफी उचित है, जब तक आप देखते हैं कि कम संभावना को सबसे चरम परिस्थितियों में भी विचार करने की आवश्यकता है, जैसा कि अब मैं आपको मानता हूं।
नोल्डोरिन

13

एक उत्कृष्ट उदाहरण तब है जब आप दो डेटाबेस के बीच की प्रतिकृति बना रहे हैं।

DB (A) int 10 के साथ एक रिकॉर्ड सम्मिलित करता है और उसी समय DB (B) ID 10. में एक रिकॉर्ड बनाता है। यह एक टक्कर है।

UUIDs के साथ ऐसा नहीं होगा क्योंकि वे मैच नहीं करेंगे। (लगभग निश्चित रूप से)


1
ठीक है, तो डीबी ए का उपयोग आईडी और डीबी बी विषम आईडी का उपयोग करें। हो गया, नो यूयूआईडी।
प्योरोलॉजिकल

2
तीन DB के साथ, 3
गुणन

20
यदि आप 2/3 / जो भी गुणक का उपयोग करते हैं, तब क्या होता है जब आप बाद में मिश्रण में एक नया सर्वर जोड़ते हैं? आपको एक स्विच को समन्वित करना होगा ताकि आप नए सर्वर पर n + 1 गुणक का उपयोग कर रहे हों, और सभी पुराने सर्वर को नए एल्गोरिथ्म में स्थानांतरित कर सकें, और आपको टकराव से बचने के लिए ऐसा करते समय सब कुछ बंद करना होगा एल्गोरिथ्म स्विच। या ... आप हर किसी की तरह यूयूआईडी का उपयोग कर सकते हैं।
बॉब अमन

3
यह उससे भी बदतर है, क्योंकि आप 2 के गुणकों और 4 के गुणकों के बीच अंतर कैसे करेंगे? या 3 बनाम 6 के गुणक? वास्तव में, आपको प्राइम संख्याओं के गुणकों के साथ रहना होगा। Blech! बस यूयूआईडी का उपयोग करें, यह काम करता है। Microsoft, Apple और अनगिनत अन्य लोग उन पर भरोसा करते हैं और उन पर भरोसा करते हैं।
बग़लमेंदुगी

2
@ Sidewinderguy, GUID में हमें भरोसा है! :)
रॉन क्लेन

13

एक गैर-शून्य संभावना भी है कि आपके शरीर का प्रत्येक कण एक साथ जिस कुर्सी पर बैठा है उसके माध्यम से सुरंग जाएगा और आप अचानक खुद को फर्श पर बैठे पाएंगे।

क्या आपको इसकी चिंता है?


7
बेशक, ऐसा कुछ नहीं है जिसे मैं नियंत्रित कर सकता हूं, लेकिन डिजाइन मैं कर सकता हूं।
प्योरोलॉजिकल

4
@Pyrolistical Is कि वास्तव में, मैं वास्तव में कारण है कि आप उस के बारे में चिंता मत करो मतलब है? तब तुम बड़े अजीब हो। और इसके अलावा, आप सही नहीं हैं। आप इसे नियंत्रित कर सकते हैं। यदि आप कुछ पाउंड हासिल करते हैं, तो आप इस तरह की घटना की संभावना को काफी कम कर देते हैं। क्या आप मानते हैं कि आपको वजन हासिल करना चाहिए, फिर? :-)
वेकी

8

मेरे पास यूयूआईडी से बचने के लिए एक योजना है। एक सर्वर को कहीं सेट अप करें और ऐसा करें कि हर बार सॉफ्टवेयर का कोई टुकड़ा सार्वभौमिक रूप से विशिष्ट पहचानकर्ता चाहता है, वे उस सर्वर से संपर्क करते हैं और इसे बाहर करते हैं। सरल!

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

इसलिए ... उन्हें उत्पन्न करने के लिए एक साधारण संभाव्य एल्गोरिथ्म का उपयोग करें जो पृथ्वी के जीवनकाल के दौरान विफल होने की संभावना नहीं है, या (फंड) एक प्रमुख बुनियादी ढांचे का निर्माण करता है जो कि तैनाती पीटीए होने जा रहा है और जिसमें लगातार विफलताएं हैं। मुझे पता है कि मैं किसके लिए जाऊंगा।


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

7
@BasilBourque मैं उस पहले पैराग्राफ में व्यंग्य का उपयोग कर रहा था, अगर यह स्पष्ट नहीं था।
डोनल फेलो

5

मुझे टक्कर की संभावना के बारे में सारी बात नहीं आती। मैं टक्कर के बारे में परवाह नहीं है। मुझे हालांकि प्रदर्शन की परवाह है।

https://dba.stackexchange.com/a/119129/33649

यूयूआईडी बहुत बड़ी तालिकाओं के लिए एक प्रदर्शन आपदा हैं। (200K पंक्तियाँ "बहुत बड़ी" नहीं हैं।)

आपका # 3 वास्तव में खराब है जब CHARCTER SET utf8 है - CHAR (36) 108 बाइट्स रखता है!

यूयूआईडी (GUID) बहुत "यादृच्छिक" हैं। बड़े टेबल पर एक UNIQUE या PRIMARY कुंजी के रूप में उनका उपयोग करना बहुत ही अक्षम है। इसका कारण यह है कि जब आप किसी नए UUID को चुनते हैं या UUID द्वारा चयन करते हैं, तो हर बार टेबल / इंडेक्स के आसपास कूदते हैं। जब कैश में फिट होने के लिए टेबल / इंडेक्स बहुत बड़ा हो (देखें innodb_buffer_pool_size, जो RAM से छोटा होना चाहिए, आमतौर पर 70%), 'अगला' UUID कैश नहीं किया जा सकता है, इसलिए एक धीमी डिस्क हिट होती है। जब टेबल / इंडेक्स कैश से 20 गुना बड़ा होता है, तो हिट्स का केवल 1/20 (5%) कैश होता है - आप I / O- बाउंड होते हैं।

इसलिए, UUIDs का उपयोग न करें जब तक कि या तो

आपके पास "छोटी" टेबल हैं, या आपको वास्तव में अलग-अलग जगहों से अद्वितीय आईडी बनाने के कारण उनकी आवश्यकता है (और इसे करने का दूसरा तरीका नहीं पता है)। UUIDs पर अधिक: http://mysql.rjweb.org/doc.php/uuid (इसमें मानक 36-चार UUIDs और BINARY (16) के बीच रूपांतरण के लिए कार्य शामिल हैं।)

UNIQUE AUTO_INCREMENT और UNIQUE UUID दोनों का एक ही तालिका में होना एक बेकार है।

जब कोई INSERT होता है, तो सभी अद्वितीय / प्राथमिक कुंजी डुप्लिकेट के लिए जाँच की जानी चाहिए। या तो अनमोल कुंजी पर्याप्त है, जो कि एक प्राथमिक कुंजी होने के लिए InnoDB की आवश्यकता है। बिनेरी (16) (16 बाइट्स) कुछ भारी है (इसे पीके बनाने के खिलाफ एक तर्क है), लेकिन यह बुरा नहीं है। जब आपके पास द्वितीयक कुंजी होती है, तो यह भारीपन मायने रखता है। InnoDB चुपचाप प्रत्येक द्वितीयक कुंजी के अंत में PK को काट देता है। यहां मुख्य सबक माध्यमिक कुंजी की संख्या को कम करना है, विशेष रूप से बहुत बड़ी तालिकाओं के लिए। तुलना के लिए: INT UNSIGNED 0..4 बिलियन की सीमा के साथ 4 बाइट्स है। BIGINT 8 बाइट्स है।


4

यदि आप एक साधारण डेटाबेस अनुप्रयोग के लिए उदाहरणों को देखते हैं, तो एक नई वस्तु बनाने से पहले हर बार डेटाबेस को क्वेरी करने के लिए, आपको जल्द ही पता चलेगा कि यूयूआईडी का उपयोग प्रभावी रूप से आपके सिस्टम की जटिलता को कम कर सकता है। दी गई - यदि आप int कुंजियों का उपयोग करते हैं तो 32 बिट हैं, जो कि 128bit UUID के एक चौथाई में संग्रहित होगी। दी गई - यूयूआईडी पीढ़ी के एल्गोरिदम केवल एक संख्या बढ़ाने से अधिक कम्प्यूटेशनल शक्ति लेते हैं। लेकिन कौन परवाह करता है? एक "प्राधिकरण" को प्रबंधित करने का ओवरहेड, अन्यथा अद्वितीय संख्याओं को आसानी से निर्दिष्ट करने के लिए, जो कि आपकी इच्छित विशिष्टता आईडी स्थान के आधार पर, परिमाण के आदेशों से आगे निकल जाता है।


3

UUID == आलसी डिज़ाइन पर

मैं अपने झगड़े लेने के बारे में असहमत हूं। यदि एक डुप्लिकेट UUID सांख्यिकीय रूप से असंभव है और गणित सिद्ध है तो चिंता क्यों? अपने छोटे N UUID जनरेटिंग सिस्टम के चारों ओर डिजाइनिंग का समय अव्यवहारिक है, हमेशा एक दर्जन अन्य तरीके हैं जिनसे आप अपने सिस्टम को बेहतर बना सकते हैं।


1

मेरी पिछली नौकरी में, हमें तीसरे पक्ष से वस्तुएं मिल रही थीं, जिन्हें यूयूआईडी के साथ विशिष्ट रूप से पहचाना गया था। मैंने UUID-> लंबे पूर्णांक लुकअप टेबल में रखा और लंबे पूर्णांक को अपनी प्राथमिक कुंजी के रूप में उपयोग किया क्योंकि यह उस तरह से तेज था।


यकीन है, UUID का उपयोग करने के लिए मजबूर करने वाला तीसरा पक्ष एक और मुद्दा है जिसे मैं नहीं चाहता हूं। मान लें कि आपके पास UUID का उपयोग करने के लिए नियंत्रण है या नहीं।
प्योरोलॉजिकल

खैर, एक "लंबे पूर्णांक" (128 बिट) वास्तव में एक यूयूआईडी क्या है। यह केवल मानव उपभोग के लिए एक स्ट्रिंग के रूप में दिखाया गया है। कभी-कभी इसे उस तरह से प्रेषित किया जा सकता है, लेकिन भंडारण और अनुक्रमण के लिए यह निश्चित रूप से पूर्णांक रूप में तेज होगा जैसा कि आपने पाया।
निकोल

1

संस्करण 1 एल्गोरिथ्म का उपयोग करते हुए ऐसा लगता है कि यह बाधा के तहत असंभव टक्कर है कि एक ही मैक पते से 10 यूयूआईडी प्रति मिलीसेकंड से कम उत्पन्न होती हैं।

वैचारिक रूप से, UUIDs के लिए मूल (संस्करण 1) पीढ़ी योजना UUID उत्पन्न करने वाले कंप्यूटर के मैक पते के साथ UUID संस्करण को समाप्‍त करना था, और पश्चिम में ग्रेगोरियन कैलेंडर को अपनाने के बाद से 100-नैनोसेकंड अंतरालों की संख्या के साथ। । व्यवहार में, वास्तविक एल्गोरिथ्म अधिक जटिल है। इस योजना की आलोचना की गई है कि यह पर्याप्त रूप से 'अपारदर्शी' नहीं है; यह यूयूआईडी और उस समय ऐसा करने वाले कंप्यूटर की पहचान दोनों को प्रकट करता है।

किसी ने मुझे सही किया अगर मैंने गलत व्याख्या की कि यह कैसे काम करता है


कई संस्करण हैं, और कई सॉफ्टवेयर सिस्टम (उदाहरण के लिए जावा) संस्करण 1 का उपयोग नहीं कर सकते क्योंकि यह मैक पते तक पहुंचने के लिए शुद्ध जावा तरीका नहीं है।
प्योरोलॉजिकल

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

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

MS GUID केवल यादृच्छिक संख्याएँ हैं। उनके पास अब कोई मैक हिस्सा नहीं है, क्योंकि इससे सर्वर के मैक पते को रिवर्स-इंजीनियर करना संभव हो गया (जो बहुत खतरनाक निकला)।
स्टीफन स्टीगर

1

कि UUIDs कह उन लोगों के लिए बुरा डिजाइन कर रहे हैं, क्योंकि वे सकता है (कुछ हास्यास्पद छोटे संभावना पर) टकराती है, जबकि अपने डीबी उत्पन्न चाबियाँ नहीं होगा ... क्या आप जानते हैं अपने डीबी पर एक टक्कर के कारण मानव त्रुटि की संभावना को कुछ संयुक्त राष्ट्र की वजह से कुंजी उत्पन्न -उपयोग की आवश्यकता UUID4 टक्कर की संभावना की तुलना में FAR FAR FAR अधिक है। हम जानते हैं कि अगर db को दोबारा बनाया जाता है तो वह 1 पर फिर से आईडी बनाना शुरू कर देगा, और हम में से कितने लोगों को एक तालिका को फिर से बनाना होगा जब हमें यकीन था कि हमें कभी भी ज़रूरत नहीं होगी? मैं अपना पैसा UUID सुरक्षितता पर रखूंगा जब सामान किसी भी दिन अज्ञात-अज्ञात के साथ गलत होने लगे।


0

ऐसे मामलों में जहां आपको किसी और के एपीआई का उपयोग करना पड़ता है जो यूयूआईडी की मांग करता है, निश्चित रूप से हमेशा एक और समाधान होता है। लेकिन क्या वे विकल्प हल करेंगे सभी समस्याओं को हल करेंगे जो यूयूआईडी करती हैं? क्या आप हैक की अधिक परतों को जोड़कर समाप्त करेंगे, प्रत्येक को एक अलग समस्या को हल करने के लिए, जब आप उन सभी को एक बार में हल कर सकते थे?

हां, UUIDs के टकराने के लिए सैद्धांतिक रूप से संभव है। जैसा कि अन्य ने उल्लेख किया है, यह हास्यास्पद रूप से इस बात की संभावना नहीं है कि यह सिर्फ विचार करने लायक नहीं है। यह आज तक कभी नहीं हुआ और सबसे अधिक संभावना कभी नहीं होगी। इसके बारे में भूल जाओ।

टकराव से बचने का सबसे "स्पष्ट" तरीका यह है कि किसी भी सर्वर को प्रत्येक डालने पर अद्वितीय आईडी उत्पन्न करने दें, जो स्पष्ट रूप से गंभीर प्रदर्शन समस्याएं पैदा करता है और ऑफ़लाइन पीढ़ी की समस्या को बिल्कुल भी हल नहीं करता है। उफ़।

अन्य "स्पष्ट" समाधान एक केंद्रीय प्राधिकरण है जो अग्रिम में अद्वितीय संख्याओं के ब्लॉक को सौंपता है, जो अनिवार्य रूप से यूयूआईडी वी 1 जेनरेटिंग मशीन (आईईईई ओयूआई के माध्यम से) के मैक पते का उपयोग करके करता है। लेकिन डुप्लीकेट मैक पते इसलिए होते हैं क्योंकि हर केंद्रीय प्राधिकरण आखिरकार शिकंजा कसता है, इसलिए व्यवहार में यह यूयूआईडी वी 4 की टक्कर की तुलना में कहीं अधिक है। उफ़।

यूयूआईडी का उपयोग करने के खिलाफ सबसे अच्छा तर्क यह है कि वे "बहुत बड़े" हैं, लेकिन एक (काफी) छोटी योजना अनिवार्य रूप से सबसे दिलचस्प समस्याओं को हल करने में विफल रहेगी; UUIDs का आकार उन बहुत ही समस्याओं को हल करने में उनकी उपयोगिता का निहित प्रभाव है।

यह संभव है कि आपकी समस्या यूयूआईडी की पेशकश करने के लिए पर्याप्त बड़ी नहीं है, और उस स्थिति में, कुछ और उपयोग करने के लिए स्वतंत्र महसूस करें। लेकिन अगर आपकी समस्या अप्रत्याशित रूप से बढ़ती है (और सबसे अधिक होती है), तो आप बाद में स्विच करना समाप्त कर देंगे - और पहली बार में उनका उपयोग न करने के लिए अपने आप को किक करें। असफलता के लिए डिज़ाइन क्यों करें जब सफलता के लिए डिज़ाइन करना आसान हो?


-10

UUIDs वैश्विक चर से जुड़ी सभी खराब कोडिंग प्रथाओं को अपनाते हैं, केवल बदतर, क्योंकि वे सुपरग्लोबल चर हैं जिन्हें किट के विभिन्न टुकड़ों में वितरित किया जा सकता है।

हाल ही में इस तरह के एक मुद्दे को एक सटीक प्रतिस्थापन मॉडल के साथ प्रिंटर के प्रतिस्थापन के साथ मारा, और पाया कि क्लाइंट सॉफ्टवेयर में से कोई भी काम नहीं करेगा।


2
खुशी है कि हम एक ऐसे समाज में रहते हैं जो अभी भी यादृच्छिक राय के विपरीत तथ्यों पर ध्यान केंद्रित करता है, अन्यथा हम सभी ढेर अतिप्रवाह नौकरियों से बाहर होंगे। :)
मकरंद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.