2011-04-02 6 views
6

Me pregunto si podría tener algunos ojos frescos en este script de python. Funciona bien con archivos de tamaño pequeño y mediano, pero con archivos grandes (de 4 a 8 GB más o menos) se bloquea inexplicablemente después de ejecutarse durante un par de minutos.Python se cuelga al calcular SHA-1 hashs para archivos de gran tamaño en el sistema operativo Windows

Zipped script here

O:

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() 

* Actualizado *

Trabajando script en Python para el cálculo de hash SHA-1 de archivos de gran tamaño. Gracias a Ignacio Vazquez-Abrams por señalar lo que estaba mal ya Tom Zych por el código.

Zipped source here

Para utilizar simplemente arrastrar y soltar el archivo se hash en la parte superior del guión. Alternativamente, puede utilizar ya sea un símbolo del sistema con el uso de:

SHA-1HashGen.py Path&File 

Fueron SHA-1HashGen.py es el nombre de archivo del script y la ruta del archivo & es la ruta y el nombre del archivo que se va hash.

O suelte la secuencia de comandos en la carpeta SendTo (en el sistema operativo Windows; shell: sendto) para obtenerla como una opción de clic derecho.

+0

Defina "bloqueos". –

+0

La ventana del terminal simplemente se cierra instantáneamente en el medio del cálculo del hash. – Peter

+0

Por lo que vale: debe intentar iniciar su script de python desde un símbolo del sistema. De esa forma obtendrá más información sobre el error. –

Respuesta

9

Deje de leer el archivo de una vez; estás consumiendo toda la memoria en el sistema. Lea en 16MB o más en trozos en su lugar.

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

Eso es lo que pensé originalmente, pero cuando lo revisé todavía me quedaban + 2GB. – Peter

+0

Gracias resultó que tenía razón. – Peter

8

(En respuesta al comentario de Pedro que 2 GB se quedan.)

Sospecho Ignacio es correcto, no obstante. Intente reemplazar la línea de lectura/actualización por la siguiente:

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

Gracias por la ayuda su solución funcionó muy bien, es tan simple que me siento estúpido por la publicación para empezar y no averiguarlo yo mismo;) – Peter

+0

Claro si realmente quieres que sea, fue una estrecha relación, pero pensé que tu respuesta era mejor para algún pobre programador de muerte cerebral que googleará algo en algún momento en el futuro, así que lo hice. – Peter

Cuestiones relacionadas