Как обновить hashlib.md5, используя существующий хэш в python?

Я получил кэшированный экземпляр хэша:

m1 = hashlib.md5()
m1.update(b'very-very-long-data')
cached_sum = m1

и я хотел бы обновить внешний хэш с суммой, кэшированной ранее:

def append_cached_hash(external_hasher):
    # something like this
    external_hasher.update(cached_sum)

К сожалению, это не работает, так как update() ожидает байты. Я мог бы снова передать те же самые байты "очень-очень-длинных данных", но это отвергает саму идею предварительного кэширования суммы md5 для обычного объекта длинных данных.

Я мог бы сделать что-то вроде следующего:

external_hasher.update(cached_sum.hexdigest())

Однако он не дает того же необходимого результата, что и:

external_hasher.update(b'very-very-long-data')

Как я мог реализовать вышеописанную функцию?


Одна и та же проблема может быть сформулирована по-разному. Существует 3 больших набора данных, и для всех возможных комбинаций необходимо рассчитать суммы md5 с использованием python. Разрешается рассчитывать md5 один раз для каждого источника данных.

m1 = hashlib.md5(b'very-big-data-1')
m2 = hashlib.md5(b'very-big-data-2')
m3 = hashlib.md5(b'very-big-data-3')

Что я должен написать во втором параметре следующих функций печати для достижения цели?

print("sum for data 1 and data 2 is:", m1.update(m2))
print("sum for data 1 and data 3 is:", m1.update(m3))
print("sum for data 2 and data 3 is:", m2.update(m3))
print("sum for data 1, data 2 and data 3 is:", m1.update(m2.update(m3)))

Заранее спасибо за помощь!

1 ответ

Решение

Функция хеширования - это односторонняя функция, которая ест последовательность байтов переменной длины и создает последовательность фиксированной длины, хэш. Так hashlib реализация идет вместе с этим и не обеспечивает способ вытащить входную последовательность, по крайней мере, не ясную.

IMO также имеет смысл с точки зрения ООП в том смысле, что такой хеш-объект представляет собой хеш-код, поэтому его можно использовать на своем месте и передавать без несанкционированного кода, способного прочитать исходный ввод. Не уверен если hashlib объекты действительно настолько безопасны, хотя.

Таким образом, чтобы рассчитать все комбинации, вам нужно держать наборы данных доступными и использовать их напрямую. Вы можете использовать hash.copy Метод для повторного использования результатов частичного хеширования, как указано в документации:

hash.copy()

Вернуть копию ("клон") хеш-объекта. Это может использоваться для эффективного вычисления дайджестов строк, которые имеют общую начальную подстроку.

import hashlib

d1 = 'data-1'
d2 = 'data-2'
d3 = 'data-3'

h1 = hashlib.md5(d1)
# instead of hashlib.md5(d1).update(d2), or hashlib.md5(d1 + d2)
h12 = h1.copy()
h12.update(d2)
# instead of hashlib.md5(d1).update(d3), or hashlib.md5(d1 + d3)
h13 = h1.copy()
h13.update(d3)

h2 = hashlib.md5(d2)
# instead of hashlib.md5(d2).update(d1), or hashlib.md5(d2 + d1)
h21 = h2.copy()
h21.update(d1)

# ...

Как насчет хеширования суммы частичных хешей, это было бы вам полезно?

Другие вопросы по тегам