2010-12-11 4 views
0

Ich schreibe eine P2P-Anwendung in Python und verwende das hashlib-Modul, um Dateien mit demselben Inhalt, aber unterschiedlichen Namen im Netzwerk zu identifizieren.Hashlib in Windows und Linux

Die Sache ist, dass ich den Code, der den Hash für die Dateien in Windows (Vista), mit Python 2.7 und es ist sehr schnell (weniger als eine Sekunde, für ein paar Gigabyte). Also, in Linux (Fedora 12, mit Python 2.6.2 und Python 2.7.1 kompiliert von mir selbst, weil ich keine rpm mit yum gefunden habe) ist so viel langsamer, fast eine Minute für Dateien kleiner als 1GB. Die Frage ist Warum? und Kann ich etwas tun, um die Leistung in Linux zu verbessern?

Der Code für den Hash ist

import hashlib 
... 

def crear_lista(directorio): 

    lista = open(archivo, "w") 

    for (root, dirs, files) in os.walk(directorio): 
     for f in files: 
     #archivo para hacerle el hash 
     h = open(os.path.join(root, f), "r") 

     #calcular el hash de los archivos 
     md5 = hashlib.md5() 

     while True: 
      trozo = h.read(md5.block_size) 
      if not trozo: break 
      md5.update(trozo) 

     #cada linea es el nombre de archivo y su hash 
     size = str(os.path.getsize(os.path.join(root, f))/1024) 
     digest = md5.hexdigest() 

     #primera linea: nombre del archivo 
     #segunda: tamaño en KBs 
     #tercera: hash 
     lines = f + "\n" + size + "\n" + digest + "\n" 
     lista.write(lines) 

     del md5 
     h.close() 

    lista.close() 

ich die r von rb geändert und rU aber die Ergebnisse sind die gleichen

+0

Bitte reparieren Sie Ihre Code-Blöcke. – robert

Antwort

3

Sie die Datei in 64-Byte (hashlib.md5().block_size) Blöcke zu lesen und Hashing sie.

Sie sollten einen viel größeren Lesewert im Bereich von 256 KB (262144 Byte) bis 4 MB (4194304 Byte) verwenden und dann das Hash-Zeichen eingeben. dieses digup Programm liest 1MB Blöcke ein:

block_size = 1048576 # 1MB 
while True: 
    trozo = h.read(block_size) 
    if not trozo: break 
    md5.update(trozo) 
Verwandte Themen