2010-07-15 16 views
7

मुझे एक अद्वितीय स्ट्रिंग जेनरेट करने की आवश्यकता है जो लंबाई में 30 वर्ण है। सबसे पहले, मैं एक GUID उत्पन्न करने जा रहा था और केवल पहले दो अक्षर हटा दें।GUID, 30 वर्ण यादृच्छिक स्ट्रिंग

Guid.NewGuid().ToString("N").Substring(2); 

दो पहले वर्णों को हटाने से "विशिष्टता" पर महत्वपूर्ण प्रभाव पड़ता है? क्या ऐसा कुछ है जिसके बारे में मुझे चिंतित होना चाहिए?

क्या एक यादृच्छिक 30 वर्ण स्ट्रिंग उत्पन्न करने का एक बेहतर तरीका है जिसे अद्वितीय होने की गारंटी दी जाएगी?

उत्तर

5

दो हेक्साडेसिमल वर्णों को हटाकर या एक GUID से समकक्ष 8 बिट्स इसे कम अनूठा बना देंगे लेकिन 120 बिट्स अभी भी काफी अच्छे अद्वितीय मूल्य बनाते हैं। यदि आप प्रति सेकंड लाखों आईडी उत्पन्न नहीं करना चाहते हैं तो टकराव को रोकने के बिना टाइमस्टैम्प और यूनिकिफायर से कुछ बिट्स को निकालना सुरक्षित होना चाहिए। उदाहरण के लिए structure of GUIDs के लिए विकिपीडिया देखें।

एक वैकल्पिक समाधान GUID को Base64 में एन्कोड करना होगा या ऐसा कुछ ऐसा होगा यदि आप केवल हेक्साडेसिमल वर्णों के लिए बाध्य नहीं हैं। बेस 64 में एन्कोड किए गए 128 बिट्स लंबाई 24 की एक स्ट्रिंग उत्पन्न करते हैं। फिर आप स्ट्रिंग को 30 वर्णों तक पैड करने के लिए एक और 6 यादृच्छिक वर्ण भी जोड़ सकते हैं जिससे इसे और भी अनूठा बना दिया जा सके।

+0

13 वीं चरित्र (.NET में उत्पन्न GUID) हमेशा "4" हो रहा है। मुझे लगता है कि यह निश्चित बाइट्स में से एक है जिसे मैं हटा सकता हूं। टाइमस्टैम्प या यूनिकिफायर कहां स्थित होगा? – harmony

+0

4 GUID उत्पन्न करने के लिए उपयोग किए गए एल्गोरिदम के संस्करण को इंगित करता है। Http://msdn.microsoft.com/en-us/library/cc246027.aspx और आंतरिक संरचना के लिए उल्लिखित आरएफसी देखें। –

5

एक GUID छंटनी विशिष्टता खो देता है। यह समझने के लिए कि आपको समझना चाहिए कि GUID कैसे बनाया गया है। यह कुछ ही हिस्से होते हैं:

  • 60 टाइमस्टैम्प के टुकड़े
  • 48 कंप्यूटर पहचानकर्ता के टुकड़े
  • 14 uniquifier के टुकड़े
  • 6 बिट

ठीक पहले दो को त्यागकर तक वे अक्षर जिन्हें आप टाइमस्टैम्प भाग के 8 सबसे महत्वपूर्ण बिट्स को हटा रहे हैं। This article इसे अच्छी तरह से बताता है और GUID को छंटनी के खतरे बताता है। यह भी बताता है कि आप अद्वितीय पहचानकर्ताओं को बनाने के लिए GUID में उपयोग की जाने वाली तकनीक का उपयोग कैसे कर सकते हैं जो वैश्विक रूप से अद्वितीय नहीं हैं बल्कि अधिक बाध्य परिस्थितियों के लिए अद्वितीय होंगे।

1

जैसा कि अन्य उत्तरदाताओं ने मुझसे पहले कहा था, अगर आप GUID से दो अक्षर हटाते हैं, तो यह अब अद्वितीय नहीं होगा।

लेकिन एक और तरीका है: ASCII एन्कोडिंग द्वारा जानकारी या विशिष्टता खोए बिना 20 वर्ण तक GUID को छोटा करना संभव है।

जेफ Atwood द्वारा इस ब्लॉग पोस्ट देखें:
Coding Horror: Equipping our ASCII Armor

संबंधित मुद्दे