2010-12-11 21 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)