hashlib.sha1()
создает хеш-объект SHA-1, который можно обновить данными и, наконец, получить дайджест. Но вы не сохраняете этот объект. Новый объект создается и отбрасывается для каждого чанка, а затем вы создаете еще один пустой дайджест и принимаете его значение. Вы всегда хешируете одну и ту же пустую последовательность и получаете da39a3ee5e6b4b0d3255bfef95601890afd80709
.
Так как вы захватываете весь документ за один read
, нет смысла записывать его во временный файл и выполнять фрагментированные чтения. Просто хешируйте данные, которые вы взяли.
def gen_hash():
for attr, document in request.files.iteritems():
orig_filename = document.filename
new_doc = add_doc(orig_filename, orig_filename)
mhash1 = sha1(document.read()).hexdigest()
print mhash1
Предполагая, что document
представляет собой объект, подобный файлу, вы можете обновить хеш в блоках и избежать затрат памяти на чтение всего документа сразу.
def gen_hash():
for attr, document in request.files.iteritems():
orig_filename = document.filename
new_doc = add_doc(orig_filename, orig_filename)
hash = sha1()
for chunk in iter(lambda: document.read(65536), ''):
hash.update(chunk)
mhash1 = hash.hexdigest()
print mhash1
Когда iter
вызывается с двумя параметрами, первый - это функция, которая генерирует данные, а второй - конечное условие для итерации. Таким образом, iter(lambda: document.read(65536), '')
продолжает вызывать функцию, которая читает данные из document
, пока ничего не останется.