由于您希望“数字”(是的,md5 哈希只不过是一个 base16 数字,我们当然可以将其转换为 base-something 以缩短字符串)在电话中可以发音,因此我建议避免混合大写/小写. 而当我们只允许 [0-9A-Z] 时,我们可以简单地使用带有 Base36 的内置 int() 进行解码。
看:
>>> def encode(num):
import string
ALPHABET = string.digits + string.ascii_uppercase
tmp = []
while num:
num, rem = divmod(num, len(ALPHABET))
tmp.append(ALPHABET[rem])
return ''.join(reversed(tmp))
>>> import hashlib
>>> the_hash = hashlib.md5('test').hexdigest()
>>> decimal_representation = int(the_hash, 16)
>>> encoded = encode(decimal_representation)
>>> the_hash
'098f6bcd4621d373cade4e832627b4f6'
>>> decimal_representation
12707736894140473154801792860916528374L
>>> encoded
'KDISMNX5MOYU6Q6PZT8TQDPY'
>>> decimal_representation == int(encoded, 36)
True
>>> hex(int(encoded, 36))
'0x98f6bcd4621d373cade4e832627b4f6L'
您当然可以使用更长的字母来缩短生成的字符串,但是您必须编写自己的 decode() 函数。不过,应该不会太难。