क्या यह देखने लायक भी है कि क्या Guide.NewGuid () Guide.Empty है?


28

जिन परियोजनाओं पर मैं काम कर रहा हूँ उनमें से एक में निम्न पैटर्न को काफी नियमित रूप से देखा जाता है:

var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
    guid = Guid.NewGuid().ToString();
}

जबकि मैं समझता हूं कि एए GUID अद्वितीय होने की गारंटी नहीं है और MSDN प्रलेखन के अनुसार एक उत्पन्न GUID शून्य हो सकता है , क्या यह व्यावहारिक रूप से कम्प्यूटेशनल अर्थों में और डेवलपर समय दोनों के बारे में सोचने के लिए साइकिल परीक्षण भेजने के लायक है। ?


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

27
वह कोड वहाँ है कि एलीगेटर को दूर रखा जाए। क्या आप जहां कोड लिखते हैं वहां एलीगेटर हैं? नहीं? तो जाहिर है कि यह काम करता है!
एरिक लिपर्ट

3
जो भी हो, मैं एक बार में यह करूँगा।
आर्टुरो टॉरेस सांचेज़

3
पृथ्वी पर आप गाइड को तार और फिर तुलना में क्यों बदल रहे हैं? वे अपने आप ही ठीक तुलना करते हैं।
एंडी

2
प्रलेखन अद्यतन किया गया था: "लौटे Guid बराबर नहीं Guid.Empty करने की गारंटी है।"
sschoof

जवाबों:


33

मेरा सुझाव है कि यह Guide.Empty के लिए जाँच के लायक नहीं है। डॉक्स गाइड के लिए। किसी कारण के लिए नई गाइड

नए गाइड का मान सभी शून्य या किसी अन्य गाइड के बराबर होने की संभावना बहुत कम है।

Guide.NewGuid Win32 API CoCreateGuid के लिए एक आवरण है , जिसमें सभी शून्य वापस करने का कोई उल्लेख नहीं है।

रेमंड चेन ने सुझाव दिया कि आगे

CoCreateGuid का कोई मान्य कार्यान्वयन GUID_NULL उत्पन्न नहीं कर सकता है

तो, नहीं, मैं इसके बारे में चिंता नहीं करेगा। मुझे लगता है कि क्यों गाइड.न्यूजीड डॉक्स का भी उल्लेख नहीं है।


1
"और यहां तक ​​कि अगर यह किसी कारण से GUID_NULL उत्पन्न करता है, तो विशिष्टता की आवश्यकता होगी कि यह केवल एक बार ऐसा करे! (इसलिए आपको परीक्षण में इस बग को लागू करने के लिए मजबूर करने की कोशिश करनी चाहिए और फिर आप आश्वस्त हो सकते हैं कि यह उत्पादन में कभी नहीं होगा।" ) "- अच्छा लगा!
razethestray

3
@razethestray - आप सभी को मेरे कैसीनो में चाहते हैं शर्त लगा सकते हैं।
जेएफओ

10
@JeffO आप पर चुटकुले, उसने घर पर 37 बार स्पिन करना सुनिश्चित किया और अपने सारे पैसे उसी पर लगाने जा रहा है जो ऊपर नहीं आया था।
रैंडम 832

Xamarin पर, Guide.NewGuid कभी-कभी विफल हो जाता है और लगातार खाली लौटता है (जब गाइड को स्वचालित रूप से ef कोर में सौंपा गया है) यह पता लगाने में सक्षम नहीं है कि
करण हर्ष वर्धन

@KaranHarshWardhan मुझे उम्मीद है कि आपने बग के रूप में रिपोर्ट किया है। :)
कर्ट निकोल्स

43

यदि आप पाते Guid.NewGuid() == Guid.Emptyहैं कि आपने धरती पर सबसे कठिन लॉटरी जीती है। किसी भी विशिष्टता या टक्कर की जाँच से परेशान न हों। ऐसा नहीं करने के लिए क्या guids के लिए कर रहे हैं । मैं आपको गणित छोड़ दूंगा, यह वेब पर हर जगह है।

इसके अलावा, विंडोज के छापे हमेशा एक "अंक" के बराबर होते हैं 4। छापे के लिए कुछ संरचना है।

आपके द्वारा पोस्ट किया गया वह कोड स्निपेट ऐसा लगता है जैसे एक देव एक Guidचर को शुरू करना भूल गया और इसे पाया Guid.Empty। उन्होंने गलती Guid.NewGuid()से कारण के रूप में पहचान की। अब वह हमेशा के लिए इस पर विश्वास कर लेंगे।

किसी भी मामले में यह गलत सवाल है। मुझे यकीन है कि आपका कोड न केवल ड्राइंग पर Guid.Emptyबल्कि विशिष्टता पर भी निर्भर करता है । वह whileपाश अद्वितीयता को लागू नहीं करता है। समन्वय के बिना एक अद्वितीय मूल्य का उत्पादन करने के लिए मार्गदर्शिकाएँ हैं । वह उनका उपयोग मामला है।


5
+1 "गलत सवाल पूछने के लिए"। यह सभी विशिष्टता के बारे में है, यह सब वास्तव में मायने रखता है।
थॉमस स्ट्रिंगर

1
@rjzii इसे स्वीकृत उत्तर बनाने पर विचार करेगा!
ईमॉक करें

18

विधि के स्रोत कोड को देखेंGuid.NewGuid :

public static Guid NewGuid() {
    Contract.Ensures(Contract.Result<Guid>() != Guid.Empty);
    ...
}

कोड अनुबंध देखें? Guid.NewGuidविधि कभी नहीं एक खाली GUID देता है।


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

मुझे कोड कॉन्ट्रैक्ट बहुत पसंद है।
एंडी

10

यदि आप शून्य GUID के खिलाफ GUID की जाँच करने जा रहे हैं, तो आपको उसी तर्क से अपने आवेदन में अन्य सभी GUID के खिलाफ जाँच करने के लिए उचित परिश्रम करने की आवश्यकता है (क्योंकि शून्य मिलने की संभावना की संभावना के समान होना चाहिए अपने ऐप में कोई अन्य GUID प्राप्त करना *)। आपको यह दिखाने की ज़रूरत है कि आप जिस स्वयंसिद्ध क्रिया के तहत काम कर रहे हैं, उसे साबित करने के लिए यह GUID अद्वितीय होगा (जो कि वास्तव में उसी स्वयंसिद्ध है जैसा परीक्षण बनाम 0)।

जाहिर है ऐसा करना बेतुका है।

TLDR; यदि आप अद्वितीय परिणामों का उत्पादन करने के लिए NewGuid () पर भरोसा कर सकते हैं, तो आप किसी एक ज्ञात GUID का उत्पादन नहीं करने के लिए भी इस पर भरोसा कर सकते हैं।

* इसकी वास्तव में एक ही संभावना नहीं है क्योंकि .NET GUIDs हमेशा निम्नलिखित को फिट करते हैं {________-____-4___-____-____________}इसलिए NewGuid एक शून्य गाइड उत्पन्न करेगा

बस मज़े के लिए मैंने यहां डॉक्स में सुधार का सुझाव दिया: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid


3
.NET GUIDs में हमेशा 4 क्यों शामिल होता है?
आर्टुरो टॉरेस सैंचेज़

9
@ ArturoTorresSánchez: आपके सवाल के जवाब और GUID के बारे में कई और मजेदार तथ्यों के लिए, लेखों की मेरी श्रृंखला देखें जो यहां से शुरू होती हैं। ericlippert.com/2012/04/24/guid-guide-part-one मैं ध्यान देता हूं कि ल्यूक आपकी सुविधा के लिए पहले ही भाग तीन से जुड़ा हुआ है। संक्षिप्त उत्तर: संस्करण 4 GUID में हमेशा 4.34 शामिल हैं
एरिक लिपर्ट

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