मैं स्पष्ट रूप से मौलिक रूप से कुछ भी नया नहीं जोड़ रहा हूं, लेकिन इससे पहले कि मैं टिप्पणी करने की स्थिति में था, मैंने इस उत्तर को जोड़ दिया, साथ ही कोड क्षेत्र चीजों को और अधिक स्पष्ट करते हैं - वैसे भी, विशेष रूप से ओमनीफेरियस के उत्तर से @ निमो के प्रश्न का उत्तर देने के लिए:
मैं जाँच-पड़ताल के बारे में थोड़ा सोचने लगा था (विशेष रूप से ब्लॉक आकार पर सुझाव की तलाश में यहाँ आया था), और पाया है कि यह विधि आपकी अपेक्षा से अधिक तेज़ हो सकती है। सबसे तेज़ (लेकिन बहुत विशिष्ट) ले रहा है timeit.timeit
या /usr/bin/time
लगभग एक फ़ाइल की जांच के कई तरीकों में से परिणाम है। 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
उपरोक्त सूची में) सर्वव्यापी के समान है:
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
कम से कम कुछ दर्जन रन बनने पर हमेशा तेज़ होते हैं), और मेरा आमतौर पर f.read(blocksize)
बफर समाप्त होने के बाद एक अतिरिक्त मिलता है, लेकिन यह उचित रूप से दोहराने योग्य है और दिखाता है कि md5sum
कमांड लाइन पर जरूरी नहीं कि पायथन इम्प्लीमेंटेशन से ज्यादा तेज ...
संपादित करें: लंबे समय तक देरी के लिए क्षमा करें, कुछ समय में इस पर ध्यान नहीं दिया गया, लेकिन @ EdRandall के प्रश्न का उत्तर देने के लिए, मैं एक Adler32 कार्यान्वयन लिखूंगा। हालाँकि, मैंने इसके लिए बेंचमार्क नहीं चलाया है। यह मूल रूप से CRC32 के समान है: 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
-Ing यह एक 32-बिट अहस्ताक्षरित पूर्णांक है, जो यह अजगर संस्करणों में एक ही मान देता है सुनिश्चित करता है बनाने के लिए की जरूरत है।
md5sum
?