Python hashlib md5 отличается выводом и медленной скоростью по сравнению с bash md5sum? - PullRequest
1 голос
/ 21 июня 2020

У меня две проблемы, которые я пытаюсь решить. 1) Когда я запускаю hashlib md5, я получаю другой результат, чем когда я запускаю md5sum в bash. 2) Запуск программы в python занимает намного больше времени, чем bash.

Кроме того, у меня есть таблица значений md5sum, с которыми я хочу сопоставить этот тестовый файл и другие. Вывод bash в моем тестовом примере соответствует значению, которое я предоставил в таблице. Поэтому в идеале я хотел бы получить результат python, соответствующий этому.

Вот что я пробовал до сих пор:

import os
import hashlib
import gzip
import time
import subprocess

def get_gzip_md5(in_file):
    #gets the md5sum value for a given file
    
    hash_md5 = hashlib.md5()
    chunk = 8192
    
    with gzip.open(in_file, "rb") as f:
        
        while True:
            buffer = f.read(chunk)
            if not buffer:
                break
            hash_md5.update(buffer)

    return hash_md5.hexdigest()

t0 = time.process_time()

out = subprocess.run("md5sum test.fastq.gz", shell=True, stdout=subprocess.PIPE)
print(out.stdout)

t1 = time.process_time() - t0
print("Time elapsed:",t1)


t0 = time.process_time()

md5 = get_gzip_md5("test.fastq.gz")
print(md5)

t1 = time.process_time() - t0
print("Time elapsed:",t1)

Вывод:

b'b0a25d66a1a83582e088f062983128ed  test.fastq.gz\n'
Time elapsed: 0.007306102000256942
cfda2978db7fab4c4c5a96c61c974563
Time elapsed: 95.02966231200026

1 Ответ

1 голос
/ 21 июня 2020

Проблема возникает из-за того, как вы открыли свой файл в Python.

Короткий ответ:

Вам нужно изменить

gzip.open(in_file, "rb")

by

open(in_file, "rb")

И у вас будет та же сумма MD5.

Длинный ответ:

gzip.open() распакует ваш .gz файл и будет читать его содержимое в режиме rb. однако в то же время md5sum обработает сумму MD5 сжатого файла. Значит, это приведет к разным значениям суммы MD5.

Как решить эту проблему? Просто введите open сжатый файл в rb и получите его сумму MD5, не распаковывая его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...