2010-03-12 10 views
26

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

मैं इस तरह के कस्टम तरीकों का उपयोग करने की वैधता पर सवाल नहीं उठा रहा हूं, बल्कि सिर्फ कारण। अगर मुझे एक अनूठी स्ट्रिंग चाहिए, तो मैं बस यह कहता हूं:

>>> import uuid 
>>> uuid.uuid4() 
UUID('07033084-5cfd-4812-90a4-e4d24ffb6e3d') 

और मैं इसके साथ कर रहा हूं। मैं बहुत भरोसा इससे पहले कि मैं UUID को पढ़ने नहीं था, इसलिए मैं ऐसा किया:

>>> import uuid 
>>> s = set() 
>>> for i in range(5000000): # That's 5 million! 
>>>  s.add(str(uuid.uuid4())) 
... 
... 
>>> len(s) 
5000000 

नहीं एक पुनरावर्तक (मैं एक अब पर विचार बाधाओं 1.108e + 50 की तरह हैं उम्मीद नहीं होगा, लेकिन यह करने के लिए आरामदायक है इसे क्रिया में देखें)। आप 2 uuid4() एस के संयोजन से अपनी स्ट्रिंग बनाकर आधा बाधा भी कर सकते हैं।

तो, इसके साथ, लोग अनियमित तारों के लिए यादृच्छिक() और अन्य सामान पर समय क्यों व्यतीत करते हैं? क्या यूयूआईडी के बारे में कोई महत्वपूर्ण सुरक्षा समस्या है या अन्य?

+11

बीटीडब्ल्यू, यूयूआईडी की लंबाई दोगुना करने से संभव मूल्यों की संख्या बढ़ जाएगी, न केवल डबल। –

उत्तर

19

किसी संसाधन को विशिष्ट रूप से पहचानने के लिए हैश का उपयोग करके आप ऑब्जेक्ट से 'अद्वितीय' संदर्भ उत्पन्न कर सकते हैं। उदाहरण के लिए, गिट एक अद्वितीय हैश बनाने के लिए एसएचए हैशिंग का उपयोग करता है जो एक प्रतिबद्धता के सटीक परिवर्तन का प्रतिनिधित्व करता है। चूंकि हैशिंग निर्धारणवादी है, इसलिए आपको हर बार एक ही फाइल के लिए एक ही हैश मिल जाएगा।

दुनिया भर में दो लोग स्वतंत्र रूप से एक ही रेपो में समान परिवर्तन कर सकते हैं, और गिट को पता चलेगा कि उन्होंने वही परिवर्तन किया है। UUID v1, v2, और v4 इसका समर्थन नहीं कर सकते हैं क्योंकि उनके पास फ़ाइल या फ़ाइल की सामग्री से कोई संबंध नहीं है।

+1

आपत्ति! यूयूआईडी वास्तव में निर्धारक हो सकता है! यूयूआईडीवी 3 एमडी 5 हैश पर आधारित है, और यूयूआईडीवी 5 एसएचए -1 हैश पर आधारित है। – starlocke

+13

किसी को निर्धारक चीजों (अपलोड की गई फाइलें, गिट परिवर्तन, आदि) के लिए UUIDv3 या UUIDv5 चुनना चाहिए, और किसी को क्षणिक, गैर-निर्धारिती (सत्र, अस्थायी फ़ाइलें इत्यादि) के लिए UUIDv1, UUIDv2, या UUIDv4 चुनना चाहिए। – starlocke

+0

बीटीडब्ल्यू गिट में लेखक की जानकारी शामिल है और परिवर्तन सेट में तारीख प्रतिबद्ध है, इसलिए अलग-अलग लोगों द्वारा किए गए परिवर्तन एक ही हैश का उत्पादन नहीं करेंगे। '.git' फ़ोल्डर में सहेजी गई ऑब्जेक्ट फ़ाइलें हालांकि वैध उपयोग केस है। –

5

एक संभावित कारण यह है कि आप अद्वितीय स्ट्रिंग को मानव-पठनीय होना चाहते हैं। यूयूआईडी बस पढ़ने के लिए आसान नहीं हैं।

11

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

+0

@ बेन, क्या आप छवि के नाम को पंक्ति में किसी अन्य फ़ील्ड के रूप में सहेज नहीं पाएंगे, और मौजूदा छवि को ओवरराइट करने के लिए प्रोग्रामिंग तर्क का उपयोग नहीं करेंगे, या फिर एक ही छवि को अपलोड करते समय "ओओप्स" कहें। – orokusaki

+0

उनका बिंदु अभी भी मान्य है: कभी-कभी आप टकराव चाहते हैं, और GUID उन्हें प्रदान नहीं करते हैं। यह कहकर कि, कोई भी जो * अद्वितीय * स्ट्रिंग खोजने के लिए SHA-1 का उपयोग कर रहा है, शायद कुछ गलत कर रहा है, क्योंकि इसका आउटपुट लगभग इनपुट के मुकाबले कम अनूठा है। – ladenedge

+0

@ladenedge मुझे लगता है कि SHA1 समीकरण का हिस्सा है और अधिक सामान्यीकृत मूल्य बनाने के लिए (यदि रिक्त स्थान हैं, आदि)। – orokusaki

3

यूयूड्स लंबे, और अर्थहीन हैं (उदाहरण के लिए, यदि आप यूयूआईडी द्वारा ऑर्डर करते हैं, तो आपको एक अर्थहीन परिणाम मिलता है)।

और, क्योंकि यह बहुत लंबा है, मैं इसे किसी यूआरएल में नहीं रखना चाहता हूं या इसे किसी भी आकार या रूप में उपयोगकर्ता को बेनकाब नहीं करना चाहता हूं।

+1

हाँ, लेकिन यही है [shortuuid] (https://github.com/stochastic-technologies/shortuuid) के लिए है। सभी एंट्रॉपी, कोई भी लम्बाई नहीं। –

1

अन्य उत्तरों के अतिरिक्त, हैश उन चीजों के लिए वास्तव में अच्छे हैं जो अपरिवर्तनीय होना चाहिए। नाम अद्वितीय है और किसी भी समय जो कुछ भी जुड़ा हुआ है उसकी अखंडता की जांच के लिए इसका उपयोग किया जा सकता है।

1

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

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