2010-12-11 42 views
0

我正在Python中編寫一個p2p應用程序,並且正在使用hashlib模塊來標識網絡中具有相同內容但名稱不同的文件。Windows和Linux中的Hashlib

問題是我測試了在Windows(Vista)中使用Python 2.7進行文件哈希的代碼,它的速度非常快(不到一秒,幾千兆字節)。所以,在Linux下(Fedora 12,由於我自己編譯的Python 2.6.2和Python 2.7.1,因爲我沒有找到與yum相同的rpm),速度非常慢,對於小於1gb的文件幾乎是一分鐘。

問題是,爲什麼?我可以做些什麼來提高Linux的性能嗎?

的哈希代碼是

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

我通過rbrU改變r但結果是一樣的

+0

請修復您的代碼塊。 – robert 2010-12-11 17:45:08

回答

3

您正在閱讀的文件中的64字節(hashlib.md5().block_size)塊,對它們進行散列。

您應該在256KB(262144字節)至4MB(4194304字節)的範圍內使用更大的讀取值,然後對其進行散列;這一個digup程序讀取1MB塊,即:

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