GOOGLE ADS

вторник, 26 апреля 2022 г.

Хеширование файла в Python

Я хочу, чтобы python читал EOF, чтобы я мог получить соответствующий хэш, будь то sha1 или md5. Пожалуйста помоги. Вот что у меня есть до сих пор:

import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed


Решение проблемы

TL;DR используют буферы, чтобы не использовать тонны памяти.

Я полагаю, что мы подходим к сути вашей проблемы, когда рассматриваем влияние памяти на работу с очень большими файлами. Мы не хотим, чтобы этот плохой мальчик использовал 2 гигабайта оперативной памяти для файла размером 2 гигабайта, поэтому, как указывает pasztorpisti, мы должны иметь дело с этими большими файлами по частям!

import sys
import hashlib
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
md5 = hashlib.md5()
sha1 = hashlib.sha1()
with open(sys.argv[1], 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
md5.update(data)
sha1.update(data)
print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))

Что мы сделали, так это обновили наши хэши этого плохого мальчика кусками по 64 КБ, используя удобный метод обновления hashlib. Таким образом, мы используем гораздо меньше памяти, чем 2 Гб, которые потребуются для хеширования всех парней сразу!

Вы можете проверить это с помощью:

$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile

Надеюсь, это поможет!

Также все это изложено в связанном вопросе справа: Получить хэш MD5 больших файлов в Python

Приложение!

В общем, при написании Python полезно привыкнуть следовать pep-8. Например, в python переменные обычно разделяются подчеркиванием, а не в верблюжьем регистре. Но это всего лишь стиль, и никто не заботится об этих вещах, кроме людей, которым приходится читать плохой стиль... возможно, вы будете читать этот код через несколько лет.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...