我在python中有一个md5校验和;比如s = '14966ba801aed57c2771c7487c7b194a'
。
我想要的是缩短它并使其成为'a-zA-Z0-9 _.-'形式的字符串,而不会丢失随机md5校验和的熵。
输出必须是可发音的,所以我不能只做binascii.unhexlify(s)
。我也不能base64.encodestring(s)
切割它,因为那样我就会失去熵。
关于如何在不将十六进制对(00-> FF)的疯狂数字(256)映射到不同字母的情况下解决此问题的任何想法?
我想要这个的原因是能够通过电话说出整个md5校验和,但是使用整个字母+数字+一些特殊字符。
答案 0 :(得分:4)
我会快速松散地满足你的要求,并尝试一些我认为可能对你有用的东西。
阅读你写的内容,对我来说突出的要求是一种通过电话阅读消息摘要的方法。
为此,您可能需要查看Bubble Babble。 Bubble Babble旨在将摘要(或其他内容)编码为可发音的字符串:
ASCII Input Encoding ------------------------------------------------------------------ `' (empty string) `xexax' `1234567890' `xesef-disof-gytuf-katof-movif-baxux' `Pineapple' `xigak-nyryk-humil-bosek-sonax'
这是一个Python实现:http://code.activestate.com/recipes/299133-bubblebabble/
答案 1 :(得分:2)
既然你想要“数字”(是的,md5哈希只是一个base16号码,我们当然可以把它转换为base-something来缩短字符串)通过手机代词,我建议避免混合上层 - /小写。 当我们只允许[0-9A-Z]时,我们可以简单地使用带有Base36的builtin 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()函数。但不应该太难。
答案 2 :(得分:0)
*您可能会创建自己的方法来使用unicode范围中更大范围的字符对校验和进行编码...但这意味着您必须选择一组合适的字符,任何人都知道如何发音。 。
像☺ ⚓ ⚔ ☂ ☏
这样的东西看起来相当清楚,但像♨
这样的符号却没那么多......