संदर्भ के लिए, अधिक संक्षिप्त संस्करण है, हालांकि मैं यह कभी नहीं देखा है, मुझे लगता है कि f.read()
पूर्ण फ़ाइल से कम लौटने के लिए, या कई-गीगाबाइट फ़ाइल के लिए, स्मृति से बाहर चलाने के लिए f.read() के लिए संभावित है। ,
def sha1OfFile(filepath):
import hashlib
sha = hashlib.sha1()
with open(filepath, 'rb') as f:
for line in f:
sha.update(line)
return sha.hexdigest()
हालांकि कोई गारंटी नहीं कि '\n'
बिल्कुल फ़ाइल दिखाए जाते हैं इसलिए इस तथ्य है कि for
पाश हमें ब्लॉक दे देंगे नहीं है: हर किसी की उन्नति के लिए, हम मानते हैं कि ठीक करने के लिए कैसे करते हैं: कि करने के लिए एक पहले ठीक है '\n'
में समाप्त होने वाली फ़ाइल में से हमें वही समस्या मिल सकती है जो हमने मूल रूप से की थी।
def sha1OfFile(filepath):
import hashlib
sha = hashlib.sha1()
with open(filepath, 'rb') as f:
while True:
block = f.read(2**10) # Magic number: one-megabyte blocks.
if not block: break
sha.update(block)
return sha.hexdigest()
: दुर्भाग्य से, मैं संभव के रूप में बड़ी फ़ाइल के ब्लॉक से अधिक पुनरावृति करने के लिए है, जो मुझे लगता है कि इसका मतलब है कि हम एक
while True: ... break
पाश के साथ और ब्लॉक आकार के लिए एक जादुई संख्या के साथ फंस रहे हैं किसी भी इसी तरह pythonic तरीका नहीं दिख रहा है
बेशक, कौन कहता है कि हम एक मेगाबाइट तारों को स्टोर कर सकते हैं। हम शायद कर सकते हैं, लेकिन क्या होगा यदि हम एक छोटे से एम्बेडेड कंप्यूटर पर हैं?
मेरी इच्छा है कि मैं एक क्लीनर तरीके के बारे में सोच सकूं जो कि बड़ी फाइलों पर स्मृति से बाहर नहीं होने की गारंटी है और इसमें जादू संख्याएं नहीं हैं और साथ ही साथ मूल सरल पायथनिक समाधान भी किया जाता है।
यदि आप हैंश का उपयोग करने की योजना बना रहे हैं तो आप वास्तव में अंतर को अनदेखा नहीं कर सकते हैं। –
उल्लेख करने के लिए भूल गए, सिर्फ एक संदर्भ के रूप में इस्तेमाल किया गया गिट, उन्हें एक साथ उपयोग करने के लिए नहीं जा रहा है। – Ikke
यदि फ़ाइल काफी बड़ी हो सकती है, तो आप इसे एक समय में एक ब्लॉक संसाधित कर सकते हैं ताकि आपको रैम में पूरी चीज की आवश्यकता न हो: http://stackoverflow.com/questions/7829499/using-hashlib-to- compute-md5-digest-of-a-file-in-python3 – rakslice