Windows和Linux中的Hashlib

2024-09-30 12:35:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问题是,我用python2.7测试了Windows(Vista)中对文件进行哈希运算的代码,它非常快(不到一秒钟,只需几GB)。所以,在Linux中(Fedora12,我自己编译了Python2.6.2和Python2.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()

我用rb和{}修改了r,但结果是一样的


Tags: 文件path代码sizeoslinuxroothash
1条回答
网友
1楼 · 发布于 2024-09-30 12:35:21

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

相关问题 更多 >

    热门问题