मुझे & लिंकिंग की भरोसेमंद और तेज़ फ़ाइल कॉपी करने के लिए एक स्मार्ट कॉपी फ़ंक्शन की आवश्यकता है। फाइलें बहुत बड़ी हैं (कुछ गीगाबाइट्स से 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 एमबी समान हैं, बहुत कम है (इसके लिए, दो फाइलों को ठीक उसी समय एक ही पर्यावरणीय परिस्थितियों में बनाया जाना चाहिए) । तो मेरा निष्कर्ष यह है कि यह केवल प्रत्येक फ़ाइल के पहले एक्स एमबी हैश के लिए पर्याप्त होना चाहिए।
यह मेरे उदाहरण डेटा पर काम करता है, लेकिन जैसा कि मैं अनुभवहीन हूं, मैं सिर्फ यह पूछना चाहता था कि मुझे ऐसा कुछ पता है (छुपे हुए खतरे या इसे करने का बेहतर तरीका)।
बहुत बहुत धन्यवाद!
http://codereview.stackexchange.com/ – vaultah
आपको या तो गणित करने की आवश्यकता है और यह देखने की संभावना है कि आपके पास एक अनजान टक्कर है, या आपको किसी भी तरह की गारंटी है कि अलग-अलग फाइलें * हमेशा एक अलग शीर्षलेख । बाद के मामले में, आप निश्चित रूप से * हेडर के लिए * चेकसम * कर सकते हैं। पूर्व मामले में, अगर आप टकराव की संभावना रखते हैं तो आप अपने आप को तय करने की ज़रूरत है, जिसके साथ आप रह सकते हैं या नहीं। अपना डेटा जानने के बिना मदद करना मुश्किल है। –
आप पहिया को फिर से शुरू करने और [rsync] (http://en.wikipedia.org/wiki/Rsync) का उपयोग करने से बच सकते हैं। –