गाइड.न्यूजीड () बनाम नई गाइड ()


347

बीच क्या अंतर है Guid.NewGuid()और new Guid()?

कौन सा पसंद किया जाता है?


6
@ क्लिंटनवार्ड मैं व्यावहारिक रूप से C # के लिए नया हूँ और @ Bob2Chiv मैं अभी प्रोजेक्ट नहीं चला सकता और इसके बारे में उत्सुक था।
ऑस्करराइज

6
@OscarRyz - C # में जल्दी परीक्षण कोड के लिए, मैं LinqPad का उपयोग करता हूं
डेवशॉ

5
वास्तव में मेरा मानना ​​है कि यह सवाल प्रासंगिक है, क्योंकि यह भ्रामक है और मैं वास्तव में "0000000-0000 .." सर्वश्रेष्ठ डिफ़ॉल्ट के रूप में नहीं हूं। मैं सिर्फ एक समस्या है, जहां एक ग्राहक () क्योंकि परियोजना नया GUID अंदर कहीं गहरे एक प्रणाली के लिए लॉग इन नहीं कर सकता है NewGuid () के बजाय बुलाया गया था में भाग
Michiel Cornillé

3
@ डेवशॉ - लाइनक्यूपैड महान है और मैं इसका बहुत उपयोग करता हूं। लेकिन मैं यह बताना चाहता था कि विज़ुअल स्टूडियो के पास अब "C # इंटरएक्टिव" विंडो है जो इस प्रकार के परीक्षणों के लिए बहुत उपयोगी है।
मार्क मेउर

1
@ मिचिएलकोर्निल को सिर्फ भाव ही पता चला ...
जिन्स पीटर

जवाबों:


583

new Guid() एक "खाली" ऑल -० गाइड (00000000-0000-0000-0000-000000000000 बहुत उपयोगी नहीं है) बनाता है।

Guid.NewGuid() एक अद्वितीय मूल्य के साथ एक वास्तविक गाइड बनाता है, जो आप शायद चाहते हैं।


26
एक खाली यूयूआईडी वास्तव में बहुत उपयोगी है। यह एक महान विशेष मूल्य बनाता है।
जॉन हन्ना

103
एक साइड नोट पर, new Guid()के बराबर है Guid.Empty
स्टीव गाइडी

30
@JonHanna सभी मार्गदर्शक महान विशेष मूल्य बनाते हैं। दुर्भाग्य से, खाली लोगों को टकराने की प्रवृत्ति होती है। मैं मानता हूँ कि खाली छापे उपयोगी होते हैं, आम तौर पर यह इंगित करने के लिए कि कुछ अनधिकृत है।
MarkPflug

5
खाली वाले बहुत उपयोगी होते हैं क्योंकि वे टकराते हैं। एक विशेष मूल्य जो ज्ञात विशेष मूल्य से नहीं टकराया था, वह बेकार हो जाएगा।
जॉन हन्ना

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

37

Guid.NewGuid() एक एल्गोरिथ्म का उपयोग करके एक नया UUID बनाता है जिसे बहुत ही असंभावित रूप से टकराव बनाने के लिए डिज़ाइन किया गया है।

new Guid() एक UUID बनाता है जो सभी शून्य है।

आम तौर पर आप पूर्व को पसंद करेंगे, क्योंकि यह UUID का बिंदु है (जब तक कि आप इसे कहीं और से प्राप्त नहीं कर रहे हैं)।

ऐसे मामले हैं जहां आप वास्तव में एक सर्व-शून्य यूयूआईडी चाहते हैं, लेकिन इस मामले में Guid.Emptyया default(Guid)आपके इरादे के बारे में स्पष्ट है, और किसी को यह पढ़ने की संभावना कम है कि एक अद्वितीय मूल्य की उम्मीद है।

सभी में, new Guid()यह स्पष्टता की कमी के कारण उपयोगी नहीं है, लेकिन एक मान-प्रकार का होना संभव नहीं है, जिसमें एक पैरामीटर रहित निर्माता नहीं है जो एक सभी-शून्य-और-शून्य मान लौटाता है।

संपादित करें: वास्तव में, एक मान प्रकार पर एक पैरामीटर रहित निर्माता होना संभव है जो शून्य और अशक्त करने के लिए सब कुछ सेट नहीं करता है, लेकिन आप इसे C # में नहीं कर सकते हैं, और जब यह कहा जाएगा और कब होगा इसके बारे में नियम बस एक ऑल-जीरो स्ट्रक्चर बनाया जाना भ्रमित करने वाला है, इसलिए यह वैसे भी अच्छा विचार नहीं है।


16
मैं इसे मनोरंजन के लिए जोड़ूंगा। टकराव की संभावना के 1% के लिए, आपको लगभग 2,600,000,000,000,000,000 GUIDs उत्पन्न करने की आवश्यकता होगी
क्लिंटन वार्ड

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

2
यह v1 गाइड था। नए MS GUIDs V4 हैं और GUID पीढ़ी के हिस्से के रूप में मैक पते का उपयोग नहीं करते हैं। हालांकि समय अभी भी एक कारक है
क्लिंटन वार्ड

16

[मैं समझता हूं कि यह एक पुराना धागा है, बस कुछ और विस्तार को जोड़ते हुए] मार्क और जॉन हैना के दो उत्तर मतभेदों को जोड़ते हैं, भले ही इसमें कुछ दिलचस्पी हो सकती है

Guid.NewGuid()

आखिरकार CoCreateGuid (OLE32 पर एक COM कॉल) (संदर्भ यहाँ ) और वास्तविक कार्य UuidCreate द्वारा किया जाता है ।

Guide.Empty का उपयोग यह जांचने के लिए किया जाता है कि क्या किसी गाइड में सभी शून्य हैं। यह नई गाइड के साथ प्रश्न में गाइड के मूल्य की तुलना के माध्यम से भी किया जा सकता है ()

इसलिए, यदि आप एक की जरूरत है अद्वितीय पहचानकर्ता , जवाब है Guid.NewGuid ()


-2

Guid.NewGuid(), जैसा कि यह इरादा के रूप में GUIDs बनाता है।

Guid.NewGuid()एक खाली Guidऑब्जेक्ट बनाता है , इसे कॉल करके आरंभ करता है CoCreateGuidऔर ऑब्जेक्ट को लौटाता है।

new Guid() केवल एक खाली GUID (सभी शून्य, मुझे लगता है) बनाता है।

मुझे लगता है कि उन्हें कंस्ट्रक्टर को सार्वजनिक करना था जैसा Guidकि एक है struct


5
एक उत्तर को जोड़ने का क्या मतलब है जो कुछ भी नहीं जोड़ता है जो पहले से ही उन उत्तरों में मौजूद नहीं है जो वर्षों से यहां हैं?
डायनेडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.