Windows和Linux中的Hashlib

0 投票
1 回答
2660 浏览
提问于 2025-04-16 08:24

我正在用Python写一个点对点的应用程序,想用hashlib模块来识别网络中内容相同但名字不同的文件。

问题是,我在Windows(Vista)上测试了计算文件哈希值的代码,速度非常快(几GB的文件不到一秒)。但是在Linux(Fedora 12,使用自己编译的Python 2.6.2和2.7.1,因为我没找到合适的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()

我把 r 改成了 rbrU,但结果还是一样。

1 个回答

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)

撰写回答