Как обновить 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)
# ...
Как насчет хеширования суммы частичных хешей, это было бы вам полезно?