使用 Python 的字节串的密集的、人类可读的表示

Dense, human-readable representation of a string of bytes using Python

我有一堆字节要以人性化的方式输出(使用在任何 font/encoding/etc 中可用和可打印的字符)。在我的例子中,字节是 md5 总和的结果:

import hashlib
h = hashlib.md5("foo")

HASH 对象有两种向我显示其内容的方式。

print h.digest() # Uses a bunch of unprintable characters
print h.hexdigest() # Readable, but 32 characters long

第二个选项为我提供了一个行为良好的字符串,我可以阅读、剪切和粘贴等等。但这是一种低效的表示:它只使用 16 个字符,因为它是十六进制的。如果它使用整个字母表、大写字母、标点符号等,它可以给我一个更短的字符串。我可以通过扩展到十六进制之外来获得更短、更密集的摘要吗?

这是@vaultah 链接到的问题之一的修改版本:

import hashlib, string, base64

_INT_EFFICIENT_CHARS = string.letters + string.digits + string.punctuation
_L_INT_EFFICIENT_CHARS = len(_INT_EFFICIENT_CHARS)
# 
def int_efficient(x):
    rets=''
    while x>0:
        x,idx = divmod(x, _L_INT_EFFICIENT_CHARS)
        rets = _INT_EFFICIENT_CHARS[idx] + rets
    return rets

h = hashlib.md5("foo")
print h.hexdigest()

# Starting in Python 3.2, use int.from_bytes rather than converting to hex
# 
i = int(h.hexdigest(), 16)
print int_efficient(i)

print base64.b64encode(h.digest())

使用我的字母表(94 个字符)仅将结果缩短了相对于 base64 的几个字符:

acbd18db4cc2f85cedef654fccc4a4d8
Hpf=RjPL{_{4Q-[X$vdO
rL0Y20zC+Fzt72VPzMSk2A==