2011-04-02 6 views
6

में बड़ी फ़ाइलों के लिए SHA-1 हैश की गणना करते समय पाइथन क्रैश हो रहा है। मुझे आश्चर्य है कि क्या मुझे इस पायथन स्क्रिप्ट पर कुछ ताजा आंखें मिल सकती हैं। यह छोटे और मध्यम आकार की फाइलों के साथ ठीक काम करता है लेकिन कुछ मिनटों के साथ चलने के बाद बड़े (4-8 जीबी या इससे भी) यह अकल्पनीय दुर्घटनाओं के साथ काम करता है।विंडोज ओएस

Zipped script here

या:

import sys 
import msvcrt 
import hashlib 

#Print the file name (and its location) to be hashed 
print 'File: ' + str(sys.argv[1]) 

#Set "SHA1Hash" equal to SHA-1 hash 
SHA1Hash = hashlib.sha1() 

#Open file specified by "sys.argv[1]" in read only (r) and binary (b) mode 
File = open(sys.argv[1], 'rb') 

#Get the SHA-1 hash for the contents of the specified file 
SHA1Hash.update(File.read()) 

#Close the file 
File.close() 

#Set "SHA1HashBase16" equal to the hexadecimal of "SHA1Hash" 
SHA1HashBase16 = SHA1Hash.hexdigest() 

#Print the SHA-1 (hexadecimal) hash of the file 
print 'SHA-1: ' + SHA1HashBase16 

#Make a blank line 
print ' ' 

#Print "Press any key to continue..." 
print 'Press any key to continue...' 

#"Press any key to continue..." delay 
char=0 
while not char: 
    char=msvcrt.getch() 

* अद्यतन *

कार्य की गणना बड़ी फ़ाइलों के SHA-1 हैश के लिए अजगर स्क्रिप्ट। कोड के लिए क्या गलत था और टॉम ज़िच को इंगित करने के लिए धन्यवाद इग्नासिओ वाज़्यूज़-एब्राम में जाता है।

Zipped source here

बस का उपयोग खींचें और फ़ाइल ड्रॉप करने के लिए स्क्रिप्ट के शीर्ष पर टुकड़ों में बांटा जा सकता है। वैकल्पिक रूप से आप या तो के उपयोग के साथ एक कमांड प्रॉम्प्ट का उपयोग कर सकते हैं:

SHA-1HashGen.py Path&File 

थे SHA-1HashGen.py स्क्रिप्ट और पथ & फ़ाइल का फ़ाइल नाम है फ़ाइल का पथ और फ़ाइल नाम टुकड़ों में बांटा जा रहा है।

या स्क्रिप्ट को एक सही क्लिक विकल्प के रूप में प्राप्त करने के लिए SendTo फ़ोल्डर (विंडोज ओएस में; खोल: sendto) में ड्रॉप करें।

+0

"क्रैश" परिभाषित करें। –

+0

टर्मिनल विंडो हैश की गणना के बीच में तुरंत बंद हो जाती है। – Peter

+0

क्या लायक है: आपको कमांड प्रॉम्प्ट से अपनी पायथन स्क्रिप्ट लॉन्च करने का प्रयास करना चाहिए। इस तरह त्रुटि पर एक और जानकारी मिल जाएगी। –

उत्तर

9

फ़ाइल को एक बार में पढ़ना बंद करें; आप सिस्टम पर सभी स्मृति का उपभोग कर रहे हैं। इसके बजाय 16 एमबी या इतने हिस्सों में पढ़ें।

data = File.read(16 * 1024 * 1024) 
+0

यही मैंने मूल रूप से सोचा था, लेकिन जब मैंने चेक किया तो मुझे अभी भी + 2 जीबी शेष था। – Peter

+0

धन्यवाद यह पता चला कि आप सही थे। – Peter

8

(पीटर की टिप्पणी है कि 2 जीबी छोड़ दिया जाता है के जवाब में।)

मुझे लगता है इग्नेसियो सही फिर भी है। इसके साथ पढ़ने/अपडेट लाइन को बदलने का प्रयास करें:

while True: 
    buf = File.read(0x100000) 
    if not buf: 
     break 
    SHA1Hash.update(buf) 
+0

आपकी समाधान अच्छी तरह से काम करने में मदद के लिए धन्यवाद, यह इतना आसान है कि मैं पोस्ट के लिए शुरुआत करने के लिए बेवकूफ महसूस करता हूं और इसे स्वयं नहीं ढूंढता;) – Peter

+0

निश्चित रूप से यदि आप वास्तव में मुझे चाहते हैं, तो यह एक करीबी टाई थी लेकिन मैंने सोचा कि आपका जवाब बेहतर था कुछ खराब मस्तिष्क मृत प्रोग्रामर के लिए जो भविष्य में किसी बिंदु पर कुछ गूगल करेगा, इसलिए मैं इसके साथ गया। – Peter

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