2014-06-24 21 views
5

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

इम पूरी तरह से हैशिंग के लिए नए और मैं यहाँ हैश करने के लिए इस समारोह का उपयोग कर रहा:

import hashlib 

def calculate_sha256(cls, file_path, chunk_size=2 ** 10): 
    ''' 
    Calculate the Sha256 for a given file. 

    @param file_path: The file_path including the file name. 
    @param chunk_size: The chunk size to allow reading of large files. 
    @return Sha256 sum for the given file. 
    ''' 
    sha256 = hashlib.sha256() 
    with open(file_path, mode="rb") as f: 
     for i in xrange(0,16): 
      chunk = f.read(chunk_size) 
      if not chunk: 
       break 
      sha256.update(chunk) 
    return sha256.hexdigest() 

यह एक 3GB फ़ाइल के लिए एक मिनट लगता है, तो अंत में, इस प्रक्रिया को एक 16TB के लिए बहुत धीमी गति से हो सकता है HD।

अब मेरा विचार है कि चीजों को गति देने के लिए फ़ाइलों की आंतरिक संरचना के बारे में कुछ अतिरिक्त ज्ञान का उपयोग करना है: मुझे पता है कि उनमें एक छोटा हेडर होता है, फिर बहुत सारे माप डेटा होते हैं, और मुझे पता है कि उनमें रीयल-टाइम टाइमस्टैम्प हैं, इसलिए मुझे पूरा यकीन है कि, मौका यह है कि, दो फाइलों की पहली 16 एमबी समान हैं, बहुत कम है (इसके लिए, दो फाइलों को ठीक उसी समय एक ही पर्यावरणीय परिस्थितियों में बनाया जाना चाहिए) । तो मेरा निष्कर्ष यह है कि यह केवल प्रत्येक फ़ाइल के पहले एक्स एमबी हैश के लिए पर्याप्त होना चाहिए।

यह मेरे उदाहरण डेटा पर काम करता है, लेकिन जैसा कि मैं अनुभवहीन हूं, मैं सिर्फ यह पूछना चाहता था कि मुझे ऐसा कुछ पता है (छुपे हुए खतरे या इसे करने का बेहतर तरीका)।

बहुत बहुत धन्यवाद!

+2

http://codereview.stackexchange.com/ – vaultah

+1

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

+1

आप पहिया को फिर से शुरू करने और [rsync] (http://en.wikipedia.org/wiki/Rsync) का उपयोग करने से बच सकते हैं। –

उत्तर

3

आप breaking them into small byte chunks द्वारा बड़ी फ़ाइलों के एमडी 5 हैश प्राप्त कर सकते हैं।

इसके अलावा, एमडी 5 हैश की गणना महत्वपूर्ण रूप से faster than SHA-256 है और किसी भी एप्लिकेशन के प्रदर्शन कारणों के लिए अनुकूल होना चाहिए जो सुरक्षा उद्देश्यों के लिए हैश पर भरोसा नहीं करता है।

+0

मैंने सभी टिप्पणियां और उत्तर, दिए गए लिंक ले लिए हैं और अब मैं एमडी 5 का उपयोग कर रहा हूं, पहले 16 एमबी हैश, और यदि मैं एक ही हैश के साथ दो फाइलों को खोजता हूं, तो मैं 32 एमबी के लिए अपने हैश को फिर से समझता हूं, फिर 64 एमबी के लिए। ।, जब तक कि हैश अलग-अलग नहीं हो जाते हैं, एक फ़ाइल ईओएफ की रिपोर्ट करती है लेकिन दूसरा नहीं है (उन दो मामलों पर विचार "बराबर नहीं") या दोनों फाइलें ईओएफ की रिपोर्ट करती हैं और हैश समान है (फ़ाइलों को बराबर मानते हुए)। आप सभी को धन्यवाद! – Blutkoete

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