2017-02-10 18 views
0

Я пытаюсь написать код, предотвращающий обновление измененных списков. Для этого я вычисляю хэш SHA1 значений, но hexdigest() этого хэша производит разные результаты, когда я перезапускаю свой интерпретатор ipython. Почему это?Хеширование с SHA1 в python3 не приводит к такому же результату

In [1]: import hashlib 

In [2]: hashid = hashlib.sha1() 

In [3]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [4]: hashid.hexdigest() 
Out[4]: '53ca01b21fd7cb1996634bb45ad74851f73c45d3' 

Когда переинициализация Хашида и делать вычисления хэша снова в тех же консолях ipython3 он работает:

In [5]: hashid = hashlib.sha1() 

In [6]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [7]: hashid.hexdigest() 
Out[7]: '53ca01b21fd7cb1996634bb45ad74851f73c45d3' 

Но остановить мою консоль и перезагрузить его производят различные результаты:

In [7]: exit 
[email protected] ~/ $ ipython3 
In [1]: import hashlib 

In [2]: hashid = hashlib.sha1() 

In [3]: hashid.update(repr(frozenset(sorted(["a","b","c"]))).encode("utf-8")) 

In [4]: hashid.hexdigest() 
Out[4]: '6e5813fcb173e35e81d6138eab4d21482885e7eb' 

Почему это? И как я могу получить один и тот же SHA1 хэш/hexdigest результат при наличии идентичных отсортированных списков?

ответ

1

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

Поменяйте свои frozenset и sorted звонки, чтобы получить последовательно воспроизводимое представление. Сортировано list s гарантировал порядок, в то время как frozenset получит Вас уникальность гарантии:

hashid.update(repr(sorted(frozenset(["a","b","c"]))).encode("utf-8")) 
+0

аааа TNX, что имеет смысл ... Мог бы часами искал для этого. Это многое проясняет. – RvL

+0

** Пожалуйста, не добавляйте комментарий к ответу, чтобы сказать «Спасибо». ** Если ответ вам помог, [примите его] (http://stackoverflow.com/help/someone-answers). BTW Вас задали 29 вопросов, но приняли только первые. Зачем? –

 Смежные вопросы

  • Нет связанных вопросов^_^