Как перевести из шестнадцатиричного дайджеста в дайджест и наоборот?

#python #hash #binary-data

#python #хэш #двоичные данные

Вопрос:

Я хочу хранить хэши как двоичные (64 байта). Но для любого типа API (веб-службы) Я бы хотел передавать их в виде строк. hashlib.hexdigest() даст мне строку и hashlib.digest() даст мне двоичный файл. Но если, например, я читаю в двоичной версии с диска, как мне преобразовать ее в строку? И если я прочитаю строку из веб-службы, как мне преобразовать ее в двоичный файл?

Ответ №1:

Возможно, вы захотите изучить binascii модуль, в частности hexlify , и unhexlify функции.

Комментарии:

1. Или вы можете использовать встроенный bytes.fromhex() .

Ответ №2:

В 2.x вы можете использовать str.decode('hex') и str.encode('hex') для преобразования между необработанными байтами и шестнадцатеричной строкой. В 3.x вам нужно использовать binascii модуль.

Ответ №3:

Вы могли бы начать со строковой версии для передачи и отображения:

 >>> import hashlib
>>> string_version = hashlib.md5(b'hello world').hexdigest()
 

Преобразуйте его в двоичный файл, чтобы записать его на диск:

 >>> save_as_binary = string_version.encode('utf-8')
>>> print(save_as_binary)
b'5eb63bbbe01eeed093cb22bb8f5acdc3'
 

При чтении с диска преобразуйте его обратно в строку:

 >>> back_to_string = save_as_binary.decode('utf-8')
>>> print(back_to_string)
5eb63bbbe01eeed093cb22bb8f5acdc3
 

Комментарии:

1. Чтобы уточнить: hashlib.md5(b'hello world').hexdigest().decode('hex') == hashlib.md5(b'hello world').digest()

2. @Бен большое спасибо . Это сэкономило много моего времени. Я работаю над aws s3 и пытался выяснить, как происходит преобразование ETag из string-> binary-> string .. В Интернете есть много ответов, но у меня ничего не получалось. Но когда я попробовал ваш ответ, он сработал просто отлично. Так что большое вам спасибо.

3. Оператор string_version.encode('utf-8') не предоставляет двоичную интерпретацию шестнадцатеричного числа. Он просто выдает двоичную строку шестнадцатеричной строки. save_as_binary — это не то же самое, что digest(), который был запрошен.