2009-11-26 18 views
5

के रूप में GUID के हिस्सों का उपयोग करके मैं एक एएसपी .NET एमवीसी अनुप्रयोग विकसित कर रहा हूं। मेरे कार्यों में से एक पैरामीटर के रूप में id की आवश्यकता है। उदाहरण के लिए:आईडी

public actionresult Detail(Guid id){ 
    return View(); 
} 

आप देख सकते हैं, मैं Guid बजाय Int उपयोग कर रहा हूँ। मुद्दा अधिक कॉस्मेटिक है। यूआरएल बहुत लंबा हो सकता है, जैसे localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2

क्या Guid के localhost/Detail/0c157b42 जैसे कुछ हिस्सों को सुरक्षित रखना सुरक्षित है?

उत्तर

4

GUID इस तरह से डिज़ाइन किया गया है कि यह अद्वितीय होना है, लेकिन इसका कोई भी हिस्सा नहीं है। विवरण के लिए this blog post देखें। यदि आपको GUID को छोटा करने की आवश्यकता है तो इसका एक अच्छा हैश - जैसे SHA-1 या (यदि आपके पास सुरक्षा संबंधी चिंताएं नहीं हैं) MD5।

+0

छोटा करना? आपका मतलब है, आप एक 36 चार लंबी GUID लेते हैं (यदि प्रश्न में उदाहरण मान्य है), और __shorten__ इसे 32 वर्णों में?(__if__ आप एमडी 5 का उपयोग करते हैं, जिसके परिणामस्वरूप 32 वर्ण होंगे, न कि SHA1, जिसके परिणामस्वरूप 48 वर्ण होंगे) – pihentagy

+0

@pihentagy: बिंदु यह है कि हैशिंग के बाद आप हैश का हिस्सा ले सकते हैं और यह पर्याप्त यादृच्छिक होगा, लेकिन आप GUID का हिस्सा नहीं ले सकते हैं। – sharptooth

3

नहीं, यह सुरक्षित नहीं है।

हालांकि आप इसके SHA-2 हैश की गणना कर सकते हैं, और उसके पहले कुछ अक्षर ले सकते हैं।

+0

यह अद्वितीय नहीं होगा! – pihentagy

+0

यह एक GUID के एक सबस्ट्रिंग से अधिक अद्वितीय होगा, और शायद यादृच्छिक संख्या से अधिक अद्वितीय होगा। – Spongeboy

2

नहीं, आपको पूरी GUID की आवश्यकता है क्योंकि एक संभावना है कि एक सबसेट अद्वितीय नहीं हो सकता है।

उदाहरण के लिए:

0c157b42-379d-41d5-b9ba-83e9df9985b2

0c157b42-379d-41d5-b9ba-83e9df9985b3

सूचना, केवल पिछले संख्या अलग है। शुरुआत दोनों ही हैं। आप GUID के पीछे के अंत का उपयोग नहीं कर सकते हैं क्योंकि यह अनुमान लगाने का कोई तरीका नहीं है कि GUID का कौन सा हिस्सा इसके निर्माण के दौरान बदल जाएगा।

-2

एक देर से प्रतिक्रिया के बिट लेकिन मामले में किसी को भी इस पर लिखा है ...

उपयोग के आधार पर, आपको एक छोटा GUID मूल्य प्रदान की जा सकता है।

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

यह तकनीक भी सलाह दी जाती है यदि आप GUID के हैश मान को भी ट्रिम करते हैं .. बस सुरक्षित रहें। असल में जब भी आप यादृच्छिक रूप से आईडी के रूप में उपयोग करने के लिए एक मूल्य उत्पन्न करते हैं तो आपको यह सुनिश्चित करना चाहिए कि यह 'पहले से उपयोग में नहीं है'

+0

मैं दौड़ की स्थिति के जोखिम के कारण, "चेक पहले से उपयोग में नहीं है" करने के खिलाफ सलाह दूंगा। ऐसा करने का मतलब है कि आपको डेटाबेस को लॉक करने की आवश्यकता है, यदि कोई अन्य धागा एक ही आईडी को एक ही समय में उत्पन्न करता है। पूर्ण GUID बनाने के लिए बहुत बेहतर है, या डीबी की जिम्मेदारी पर आईडी निर्माण को धक्का दें (उदा। ऑटो-वृद्धि इंट) – Spongeboy

0

कुछ अन्य विकल्पों पर विचार करने के लिए- * यदि GUID के साथ शुरू होने वाले एक से अधिक विवरण हैं 0c157b42, यूआरएल लोकलहोस्ट/विस्तार/0c157b42 लागू विवरण ऑब्जेक्ट्स की एक सूची दिखाएं। * यूआरएल एलियासिंग - विवरण ऑब्जेक्ट पर "फ्रेंडली यूआरएल" फ़ील्ड के लिए अनुमति दें।

0

आप GUID को साफ़ कर सकते हैं और HEX को बेस 32 (ए-जेड, 0-5) में परिवर्तित कर सकते हैं जो इसे 16 वर्णों तक छोटा कर देगा।

+0

मार्गदर्शिका 128 बिट पूर्णांक हैं। बेस 32 प्रति चरित्र 32 मान है, जो '2^5', 5 बिट्स है। पूरी तरह से एक guid का प्रतिनिधित्व करने के लिए आपको '128/5 = 25.6' वर्णों की आवश्यकता होगी। बेस 64 '128/6 = 21.3' के साथ छोटा होगा। आंशिक घटकों को पैडिंग द्वारा पहचाना जाता है, इसलिए आपको उन आंकड़ों को क्षतिपूर्ति करने के लिए दो अंकों तक टक्कर मारनी होगी। – Travis