Python: как создать одно хеш-значение из двух файлов - PullRequest
1 голос
/ 13 июня 2019

Я хочу создать хеш из двух файлов, но не знаю, как это сделать.

Я могу хешировать один файл за раз, используя приведенный ниже код.

#functions: create sha384 hash
def create_hash(folder, filename):
    BLOCKSIZE = 65536
    hasher = hashlib.sha384()
    with open(folder + filename, 'rb') as afile:
        buf = afile.read(BLOCKSIZE)
        while len(buf) > 0:
            hasher.update(buf)
            buf = afile.read(BLOCKSIZE)
    #print(hasher.hexdigest())
    return BLOCKSIZE, hasher

BLOCKSIZE, hasher = create_hash(ARCHIVE_FOLDER, ARCHIVE_FILENAME)

В идеале я бы хотел настроить это так, чтобы он занимал два файла и генерировал один хэш из двух файлов?Не уверен, возможно ли это на самом деле.

Редактировать: я обновил код следующим образом.Он работает, но я получаю только следующий вывод, и я не уверен, почему.У кого-нибудь есть идеи?

в сочетании: встроенный метод hexdigest объекта _hashlib.HASH по адресу 0x000001DFFC9929B8

#functions: create sha384 hash
def create_hash2(folder, filename1, filename2):
    BLOCKSIZE = 65536
    hasher = hashlib.sha384()
    with open(folder + filename1, 'rb') as afile, open(folder + filename2, 'rb') as bfile:
        buf = afile.read(BLOCKSIZE) and bfile.read(BLOCKSIZE)
        while len(buf) > 0:
            hasher.update(buf)
            buf = afile.read(BLOCKSIZE) and bfile.read(BLOCKSIZE)
    #print(hasher.hexdigest())
    return BLOCKSIZE, hasher

        #test
        BLOCKSIZE, hasher = create_hash2(ARCHIVE_FOLDER, '1--2019-06-13-archive.zip', '2--2019-06-13-archive.zip')
        print('combined: ' + str(hasher.hexdigest))

1 Ответ

1 голос
/ 13 июня 2019

Вы можете просто зациклить файлы:

def create_hash(folder, filenames):  # takes an arbitrary number of filenames
    BLOCKSIZE = 65536
    hasher = hashlib.sha384()
    for filename in filenames:
        with open(folder + filename, 'rb') as afile:
            buf = afile.read(BLOCKSIZE)
            while len(buf) > 0:
                hasher.update(buf)
                buf = afile.read(BLOCKSIZE)
    return BLOCKSIZE, hasher

BLOCKSIZE, hasher = create_hash(ARCHIVE_FOLDER, (ARCHIVE_FILENAME_1, ARCHIVE_FILENAME_2))

Обратите внимание, что важен порядок, в котором вы указываете имена файлов (т. Е. Если вы поменяете местами два имени файла, хеш почти наверняка будет другим).

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