2010-03-14 8 views
8

मैं बड़ी संख्या में फाइलें रख रहा हूं, और हैश टकराव से बचने के लिए, मैं एक फ़ाइल का मूल आकार भी संग्रहीत कर रहा हूं - इस तरह, यहां तक ​​कि अगर हैश टक्कर हो, तो यह बेहद असंभव है कि फ़ाइल आकार भी समान होंगे। क्या यह आवाज है (एक हैश टकराव समान रूप से किसी भी आकार का होने की संभावना है), या मुझे जानकारी का एक और टुकड़ा चाहिए (यदि टकराव मूल के समान लंबाई भी होने की संभावना है)।क्या हैश टकराव अलग फ़ाइल आकार के साथ ही फ़ाइल आकार के समान हैं?

या, अधिक आम तौर पर: क्या मूल फ़ाइल आकार के बावजूद हर फ़ाइल एक विशेष हैश उत्पन्न करने की संभावना है?

+0

कैसे हैशिंग? SHA-1? – bmargulies

+0

@bmargulies: मुझे लगता है कि मैं आम तौर पर पूछ रहा हूं, लेकिन मैं वर्तमान में SHA256 जैसे कुछ स्विच करने पर विचार कर SHA1 का उपयोग कर रहा हूं। मैं बस सोच रहा हूं कि यदि मैं फ़ाइल आकार पर भी कुंजी डाल रहा हूं तो एक हैश कितना समय आवश्यक है। – SqlRyan

+0

मेरे पास एक ही विचार था। हमें हैश फाइलों की आवश्यकता है, लेकिन हमें अधिकतम गति (यानी एमडी 5) की आवश्यकता है और फाइलें आकार में जंगली रूप से भिन्न होती हैं। यदि दो अलग-अलग फ़ाइल आकारों पर एक ही एमडी 5 हैश प्राप्त करना संभव है, तो सुरक्षा की एक अतिरिक्त परत के लिए एमडी 5 + आकार दोनों को स्टोर करना उचित हो सकता है। हम लाखों (शायद यहां तक ​​कि एक बिलियन) फाइलों के माध्यम से हैंशिंग कर रहे हैं, इसलिए हमारे मामले में यह फ़ाइल आकार सहित लायक हो सकता है। – Brain2000

उत्तर

4

आपके हैश फ़ंक्शन पर निर्भर करता है, लेकिन सामान्य रूप से, एक ही आकार की फ़ाइलें, लेकिन अलग-अलग सामग्री एक ही हैश को अलग-अलग आकार की फ़ाइलों के रूप में उत्पन्न करने की संभावना कम होती है। फिर भी, फ़ाइल आकार को संग्रहीत करने जैसे आपके स्वयं के समाधानों पर शर्त लगाने के बजाय, संभवतः एक समय-परीक्षण हैश का उपयोग करने के लिए क्लीनर (उदाहरण के लिए सीआरसी 32 के बजाय एमडी 5, या एमडी 5 के बजाय एसएचए 1) का उपयोग करने के लिए क्लीनर होगा।

+0

मैं फ़ाइल आकार के साथ संयोजन में हैश का उपयोग करने पर विचार कर रहा था - इस तरह, टकराव की संभावना में, मैं फ़ाइल आकार को एक अतिरिक्त कुंजी के रूप में जांचता हूं ताकि यह देखने के लिए कि यह वास्तव में एक ही फ़ाइल थी या नहीं। – SqlRyan

+1

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

+0

आह - यह समझ में आता है। मैंने सोचा कि मैं किसी भी तरह से "बड़ा" हैश फ़ंक्शन चुनने के बेहतर होगा, तो हो सकता है कि मैं ऐसा करूँगा। – SqlRyan

1

हैश फ़ंक्शंस इस तरह से डिज़ाइन किए गए हैं कि टकराव प्राप्त करना बहुत मुश्किल हो, अन्यथा वे प्रभावी नहीं होंगे।
यदि आपके पास हैश टक्कर है जो बिल्कुल अविश्वसनीय लगभग 1: number_of_possible_hashes संभावना है जो फ़ाइल आकार के बारे में कुछ भी नहीं कहती है।

यदि आप वास्तव में हैश टकराव के बारे में दोबारा सुनिश्चित करना चाहते हैं, तो आप एक ही फ़ाइल के लिए दो अलग-अलग हैंश की गणना कर सकते हैं - यह हैश + फ़ाइल आकार को सहेजने से कम त्रुटि-प्रवण होगा।

+0

मैं वास्तव में ऐसा करने पर विचार कर रहा था - मेरा अन्य प्रश्न देखें, http://stackoverflow.com/questions/2437345/tracking-unique-versions-of-files-with-hashes। मुझे लगा कि दो हैंश (जैसे SHA1 और MD5), साथ ही साथ फाइलसाइज की बचत, टकराव को इतनी खगोलीय रूप से असंभव कर देगा कि मुझे इसके बारे में चिंता करने की ज़रूरत नहीं है। – SqlRyan

+0

दिखाओ कि आप sha256 का उपयोग कर रहे हैं जो आपको 2^256 संभावित हैश मान देता है और आपके पास लाखों फाइलें हैं जो 1 000 000 000 * 1 000 000 2^50 के अनुमानित हैं, इसलिए आप 2^2 के औसत से समाप्त हो रहे हैं बिना किसी टक्कर के खतरे के प्रत्येक फ़ाइल के लिए 200 संभव हैश मान। क्या यह बहुत बड़ा नहीं है? अधिक सटीक होने के लिए आप '1 - ((2^256)! ((2^256) - 10^15) की गणना करके हैश टकराव की संभावना का मूल्यांकन करने का प्रयास कर सकते हैं!)/((2^256)^(10^15)) या यदि इतना सटीक नहीं है '1 - (1 - (10^15)/(2 * 2^256))^(10^15)' जो आपको टक्कर का 4e-48' मौका देगा। – Li0liQ

1

हैश का आकार मूल डेटा के आकार के बावजूद समान है। चूंकि केवल संभावित संख्या में सीमित संख्या है, यह सैद्धांतिक रूप से संभव है कि विभिन्न आकारों वाली दो फाइलों में एक ही हैश हो। हालांकि, इसका मतलब यह भी है कि यह भी संभव है कि के साथ दो फाइलें आकार में एक ही हैश हो।

0

क्रिप्टोग्राफिक हैंश (एमडी 5, एसएचए-एक्स, आदि) के परिवार का पूरा बिंदु टकराव को असंभव रूप से असंभव बनाने के लिए है। धारणा यह है कि आधिकारिक कानूनी प्रक्रियाएं उद्देश्य पर टकराव के लिए अव्यवहारिक होने पर निर्भर रहने के लिए तैयार की जाती हैं। तो, वास्तव में, यह इन हैश के निलंबन में बेल्ट जोड़ने के लिए अंतरिक्ष और सीपीयू समय का खराब उपयोग है।

7

हैश फ़ंक्शन आमतौर पर सभी परिणाम बाल्टी में डेटा को समान रूप से वितरित करने के लिए लिखे जाते हैं।

यदि आप मानते हैं कि आपकी फ़ाइलों को उपलब्ध आकारों की एक निश्चित सीमा पर समान रूप से वितरित किया गया है, तो कहें कि केवल 1024 (2^10) आपकी फ़ाइलों के लिए समान रूप से वितरित अलग-अलग आकार हैं। फ़ाइल आकार को सर्वोत्तम रूप से संग्रहीत करने से केवल अलग-अलग फ़ाइल आकारों की संख्या से टक्कर का मौका कम हो जाता है।

नोट: हम इसे 2^32 समान रूप से वितरित और विशिष्ट आकार मान सकते हैं और यह अभी भी बाकी गणित को नहीं बदलता है।

यह आमतौर पर स्वीकार किया जाता है कि एमडी 5 (उदाहरण के लिए) पर टकराव की सामान्य संभावना 1/(2^128) है।

जब तक कुछ ऐसा नहीं है जो विशेष रूप से हैश फ़ंक्शन में बनाया गया हो जो अन्यथा कहता है। किसी भी मान्य X ऐसी है कि P(MD5(X) == MD5(X+1)) की संभावना किसी भी दो यादृच्छिक मान {Y, Z} कि X, Y और Z के किसी भी मूल्यों के लिए कहना है कि P(MD5(Y) == MD5(Z)) = P(MD5(X) == MD5(X+1)) = 1/(2^128) है के रूप में एक ही रहता है को देखते हुए।

इसे अलग-अलग फाइलों के 2^10 के साथ जोड़ना मतलब है कि फ़ाइल आकार को संग्रहीत करके आपको अतिरिक्त 10 बिट मिल रही हैं जो इंगित करती हैं कि आइटम अलग हैं या नहीं (फिर यह माना जाता है कि आपकी फ़ाइलें समान रूप से सभी मानों के लिए वितरित की जाती हैं)।

तो सबसे अच्छा आप जो कर रहे हैं, वह < = एन बाइट्स अद्वितीय मूल्यों के लायक के लिए एक और एन बाइट्स जोड़ रहा है (यह कभी भी> एन नहीं हो सकता है)। इसलिए आप SHA-1/2 जैसे कुछ का उपयोग करके अपने हैश फ़ंक्शन द्वारा लौटाए गए बाइट्स को बढ़ाने के लिए बहुत बेहतर हैं क्योंकि यह फ़ाइल आकार को संग्रहीत करने के बजाय हैश मानों का समान रूप से वितरित डेटा देने की अधिक संभावना होगी।

संक्षेप में, यदि MD5 अच्छा नहीं है पर्याप्त के लिए टक्कर न हो, एक मजबूत हैश का उपयोग करता है, तो मजबूत हैश बहुत धीमी गति से कर रहे हैं तो टकराव इस तरह के एक MD5 के रूप में की कम संभावना के साथ एक तेजी हैश का उपयोग, और फिर एक का उपयोग टकराव की संभावना को कम करने के लिए धीमी हैश जैसे SHA-1 या SHA256 है, लेकिन यदि SHA256 पर्याप्त तेज़ है और दोगुनी जगह कोई समस्या नहीं है तो शायद आपको SHA256 का उपयोग करना चाहिए।

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