Хешлиб в Windows и Linux - PullRequest
       2

Хешлиб в Windows и Linux

0 голосов
/ 11 декабря 2010

Я пишу p2p-приложение на Python и использую модуль hashlib для идентификации файлов с одинаковым содержимым, но разными именами в сети.

Дело в том, что я протестировал код, который выполняет хэшдля файлов в Windows (Vista), с Python 2.7, и это очень быстро (менее чем за секунду, на пару гигабайт).Итак, в Linux (Fedora 12 с Python 2.6.2 и Python 2.7.1, скомпилированными мной, потому что я не нашел rpm с yum) намного медленнее, почти минута для файлов менее 1 ГБ.

Вопрос в том, Почему? и Могу ли я сделать что-нибудь для повышения производительности в 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 на rb и rU, но результаты те же

1 Ответ

3 голосов
/ 11 декабря 2010

Вы читаете файл в 64-байтовых (hashlib.md5().block_size) блоках и хэшируете их.

Вам следует использовать намного большее значение чтения в диапазоне от 256 КБ (262144 байта) до 4 МБ (4194304 байта).) а затем хеш это;эта digup программа читает в блоках по 1 МБ, т.е.:

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