Windows和Linux中的Hashlib

我正在Python中编写一个p2p应用程序,并使用hashlib模块来识别networking中具有相同内容但名称不同的文件。

问题是我用Python 2.7testing了Windows(Vista)中的文件的散列码,速度非常快(不到一秒,几千兆字节)。 所以,在Linux(Fedora 12,Python 2.6.2和Python 2.7.1由我自己编译,因为我没有find与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 ,但结果是一样的

Solutions Collecting From Web of "Windows和Linux中的Hashlib"

您正在以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)