Python 3 одинаковый текст, но разные хэши md5 - PullRequest
0 голосов
/ 15 января 2019

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

В обоих случаях алгоритм выдает одну и ту же фразу (str1 и str2 ниже), но хэш md5 каждой фразы отличается. Я подтвердил это с помощью оболочки Python:

( ПРИМЕЧАНИЕ : фраза и значения хеша не являются фактическими значениями, которые используются)

>>> import hashlib
>>> 
>>> str1 = "some phrase"
>>> str2 = "some phrase"
>>> str1 == str2
True
>>> 
>>> md5 = hashlib.md5()
>>> 
>>> md5.update(str1.encode('utf-8'))
>>> hash_1 = md5.hexdigest()
>>> 
>>> md5.update(str2.encode('utf-8'))
>>> hash_2 = md5.hexdigest()
>>> 
>>> print(hash_1)
34281bdd108d35dec09dd6599bc144gf
>>> print(hash_2)
0670d0df2506c7gf0d5ee27190g2d919

Как это возможно?

1 Ответ

0 голосов
/ 15 января 2019

Согласно документации, update обновляет текущий хеш со строкой и не создает новый. Для этого вам нужно создать новый объект md5.

https://docs.python.org/2/library/hashlib.html#hashlib.hash.update

import hashlib

str1 = "some phrase"
str2 = "some phrase"
print(str1 == str2)

md51 = hashlib.md5()

md51.update(str1.encode('utf-8'))
hash_1 = md51.hexdigest()

md52 = hashlib.md5()
md52.update(str2.encode('utf-8'))
hash_2 = md52.hexdigest()



print(hash_1 == hash_2) # True

Согласно документации (опять же), обновление эквивалентно хэшированию обеих строк, вот небольшой фрагмент, чтобы показать это

import hashlib

str1 = "some phrase"
str2 = "some phrase"
print(str1 == str2)

md51 = hashlib.md5()

md51.update((str1 + str2).encode('utf-8'))
hash_1 = md51.hexdigest()

md52 = hashlib.md5()
md52.update(str1.encode('utf-8'))
md52.update(str2.encode('utf-8'))
hash_2 = md52.hexdigest()



print(hash_1 == hash_2)

Чтобы он работал в python2, просто удалите .encode('utf-8')

...