दिलचस्प पोस्ट
क्यू एंड ए सर्वेक्षण सशर्त प्रश्नों के साथ mysql डेटाबेस तालिकाओं और रिश्तों का समर्थन कैसे करेगा? MySQL में खोजशब्द खोज कैसे लागू करें? mysql_connect वी.एस. mysql_pconnect समान स्ट्रिंग एल्गोरिथम कस्टम एनिमेट करने योग्य संपत्ति बनाएं सी में स्ट्रिंग के रूप में Enum प्रकारों के चर का उपयोग करने का आसान तरीका? कॉम्बो बॉक्स। चयन किया गया बाध्यकारी स्रोत से अपडेट नहीं किया जा रहा है AngularJS गतिशील रूप से एचटीएमएल जोड़ने और नियंत्रक को बाइंड कैसे करें कैसे jQuery के साथ कुंजी कॉम्बो ट्रिगर करने के लिए iphone: जहां .dsym फ़ाइल क्रैश रिपोर्ट में स्थित है सीखना चींटी पथ शैली एंड्रॉइड अलार्म सेवा के तत्काल ट्रिगर को रोकने के लिए अगर दिन के लिए अलार्म का समय बीत चुका है वक्रार (अधिकतम) हर जगह? "रेंडर करने के बाद" कोड पर प्रतिक्रिया दें? एंड्रॉइड में ग्रिडव्यू में छवि गैलरी कैसे कार्यान्वित करें?

एक फ़ाइल का एक MD5 चेकसम उत्पन्न करना

क्या पायथन में फाइलों की एक सूची के एमडी 5 चेकसम को सृजित करने (और चेकिंग) का कोई आसान तरीका है? (मेरे पास एक छोटा सा प्रोग्राम है जिस पर मैं काम कर रहा हूं, और मैं फाइलों के चेकसम की पुष्टि करना चाहता हूं)।

Solutions Collecting From Web of "एक फ़ाइल का एक MD5 चेकसम उत्पन्न करना"

आप hashlib.md5 () का उपयोग कर सकते हैं

ध्यान दें कि कभी-कभी आप पूरी फ़ाइल को स्मृति में फिट नहीं कर पाएंगे उस मामले में, आपको क्रमशः 4096 बाइट्स की मात्रा पढ़नी होगी और उन्हें एमडी 5 फ़ंक्शन पर फ़ीड करना होगा:

 def md5(fname): hash_md5 = hashlib.md5() with open(fname, "rb") as f: for chunk in iter(lambda: f.read(4096), b""): hash_md5.update(chunk) return hash_md5.hexdigest() 

वहाँ एक तरीका है कि बहुत मेमोरी अक्षम है

एक दस्तावेज:

 print hashlib.md5(open(full_path, 'rb').read()).hexdigest() 

फाइलों की सूची:

 import hashlib [(fname, hashlib.md5(open(fname, 'rb').read()).digest()) for fname in fnamelst] 

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

 import hashlib [(fname, hashlib.sha256(open(fname, 'rb').read()).digest()) for fname in fnamelst] 

यदि आप केवल 128 बिट मूल्य के डायजेस्ट चाहते हैं तो आप कर सकते हैं। .digest()[:16]

इससे आपको ट्यूपल्स की सूची दी जाएगी, प्रत्येक टपल जिसमें फ़ाइल का नाम और उसके हश शामिल हैं

फिर मैं दृढ़ता से आपके एमडी 5 के उपयोग पर सवाल करता हूं। आपको कम से कम SHA1 का उपयोग करना चाहिए कुछ लोगों को लगता है कि जब तक आप 'क्रिप्टोग्राफिक' उद्देश्यों के लिए MD5 का उपयोग नहीं कर रहे हैं, तो आप ठीक हैं। लेकिन सामान की संभावना है कि आप शुरू में अपेक्षा की तुलना में दायरे में व्यापक रहे, और आपकी आकस्मिक भेद्यता का विश्लेषण पूरी तरह से दोषपूर्ण साबित हो सकता है। गेट के बाहर सही एल्गोरिदम का उपयोग करने की आदत में आने के लिए सबसे अच्छा है यह सिर्फ एक अलग झुंड पत्र लिख रहा है। यह इतना मुश्किल नही है।

यहां एक तरीका है जो अधिक जटिल है, लेकिन स्मृति कुशल :

 import hashlib def hash_bytestr_iter(bytesiter, hasher, ashexstr=False): for block in bytesiter: hasher.update(block) return (hasher.hexdigest() if ashexstr else hasher.digest()) def file_as_blockiter(afile, blocksize=65536): with afile: block = afile.read(blocksize) while len(block) > 0: yield block block = afile.read(blocksize) [(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.md5())) for fname in fnamelst] 

और, फिर से, क्योंकि MD5 टूटा हुआ है और वास्तव में कभी भी उपयोग नहीं किया जाना चाहिए:

 [(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256())) for fname in fnamelst] 

फिर, आप [:16] को hash_bytestr_iter(...) को कॉल करने के बाद डाल सकते हैं यदि आप केवल 128 बिट मूल्य की डायजेस्ट चाहते हैं

मैं स्पष्ट रूप से कुछ भी मूलभूत रूप से नया नहीं जोड़ रहा हूं, लेकिन इससे पहले कि मैं अपनी स्थिति टिप्पणी करने के लिए उत्तर देता हूं :-), साथ ही कोड क्षेत्रों में चीजें अधिक स्पष्ट होती हैं – वैसे भी, विशेष रूप से ओमनीफेरियस के उत्तर से @ नेमो के सवाल का जवाब देना:

मैं चेकसमों के बारे में कुछ सोच रहा था (ब्लॉक आकारों पर विशेष रूप से सुझावों के लिए यहां आया था), और पाया है कि यह विधि आपके अपेक्षा की अपेक्षा अधिक तेज हो सकती है। सबसे तेज (लेकिन सुंदर ठेठ) timeit.timeit या /usr/bin/time timeit.timeit /usr/bin/time परिणाम को लगभग लगभग एक फाइल के timeit.timeit के कई तरीकों से प्राप्त होता है 11MB:

 $ ./sum_methods.py crc32_mmap(filename) 0.0241742134094 crc32_read(filename) 0.0219960212708 subprocess.check_output(['cksum', filename]) 0.0553209781647 md5sum_mmap(filename) 0.0286180973053 md5sum_read(filename) 0.0311000347137 subprocess.check_output(['md5sum', filename]) 0.0332629680634 $ time md5sum /tmp/test.data.300k d3fe3d5d4c2460b5daacc30c6efbc77f /tmp/test.data.300k real 0m0.043s user 0m0.032s sys 0m0.010s $ stat -c '%s' /tmp/test.data.300k 11890400 

इसलिए, लगता है कि दोनों पायथन और / usr / bin / md5sum एक 11MB फ़ाइल के लिए लगभग 30ms लेते हैं। संबंधित md5sum md5sum_read फ़ंक्शन ( md5sum md5sum_read उपरोक्त सूची में) सर्वव्यापी के समान है:

 import hashlib def md5sum(filename, blocksize=65536): hash = hashlib.md5() with open(filename, "rb") as f: for block in iter(lambda: f.read(blocksize), b""): hash.update(block) return hash.hexdigest() 

यह माना जाता है कि ये एकल रन से हैं ( mmap हमेशा mmap होते हैं जब कम से कम कुछ दर्जन रन बनाए जाते हैं), और बफर के समाप्त होने के बाद मेरा आमतौर पर एक अतिरिक्त f.read(blocksize) है, लेकिन यह काफी दोहराने योग्य है और यह दिखाता है कि कमांड लाइन पर md5sum एक पायथन कार्यान्वयन से ज़्यादा तेज नहीं है …

संपादित करें: लंबी देरी के लिए क्षमा करें, कुछ समय में इस पर ध्यान नहीं दिया है, लेकिन @ एडरंडल के प्रश्न का उत्तर देने के लिए, मैं एक एडलर 32 कार्यान्वयन लिखूंगा। हालांकि, मैंने इसके लिए बेंचमार्क नहीं चलाया है। यह मूल रूप से सीआरसी 32 के समान होता है: init, अद्यतन, और डायजेस्ट कॉल के बजाय, सब कुछ एक zlib.adler32() कॉल है:

 import zlib def adler32sum(filename, blocksize=65536): checksum = zlib.adler32("") with open(filename, "rb") as f: for block in iter(lambda: f.read(blocksize), b""): checksum = zlib.adler32(block, checksum) return checksum & 0xffffffff 

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

 import os import hashlib if os.path.exists(file_path) == False: return None md5 = hashlib.md5() f = open(file_path) for line in f: md5.update(line) f.close() return md5.hexdigest()