Давайте подумаем о размерах данных. Оптимальное решение здесь составляет 16 байтов:
>>> hashlib.md5('thecakeisalie').digest()
"'\xfc\xce\x84h\xa9\x1e\x8a\x12;\xa5\xb1K\xea\xef\xd6"
>>> len(hashlib.md5('thecakeisalie').digest())
16
Первое, о чем вы подумали, был hexdigest, но он не очень близок к 16 байтам:
>>> hashlib.md5('thecakeisalie').hexdigest()
'27fcce8468a91e8a123ba5b14beaefd6'
>>> len(hashlib.md5('thecakeisalie').hexdigest())
32
Но это не даст вам ascii-кодируемых байтов, поэтому мы должны сделать что-то еще. Простая вещь, которую нужно сделать, это использовать представление python:
>>> repr(hashlib.md5('thecakeisalie').digest())
'"\'\\xfc\\xce\\x84h\\xa9\\x1e\\x8a\\x12;\\xa5\\xb1K\\xea\\xef\\xd6"'
>>> len(repr(hashlib.md5('thecakeisalie').digest()))
54
Мы можем избавиться от всего этого, удалив символы "\ x" и окружающие кавычки:
>>> repr(hashlib.md5('thecakeisalie').digest())[1:-1].replace('\\x','')
"'fcce84ha91e8a12;a5b1Keaefd6"
>>> len(repr(hashlib.md5('thecakeisalie').digest())[1:-1].replace('\\x',''))
28
Это довольно хорошо, но base64 работает немного лучше:
>>> base64.b64encode(hashlib.md5('thecakeisalie').digest())
J/zOhGipHooSO6WxS+rv1g==
>>> len(base64.b64encode(hashlib.md5('thecakeisalie').digest()))
24
В целом, base64 наиболее экономичен, но я бы просто использовал hexdigest, поскольку он наиболее оптимизирован (эффективен по времени).
Ответ Гнибблера дает длину 16!
>>> hashlib.md5('thecakeisalie').digest().decode("iso-8859-1")
u"'\xfc\xce\x84h\xa9\x1e\x8a\x12;\xa5\xb1K\xea\xef\xd6"
>>> len(hashlib.md5('thecakeisalie').digest().decode("iso-8859-1"))
16