我正在使用md5函数将字符串散列为32位字符串。
str_to_encode = 'this is a test string which I want to encode'
encoded = hashlib.md5(str_to_encode).hexdigest()
我希望能够将此字符串(即上例中的encoded
)解码回其原始值。我认为这不可能使用md5(但如果它是请让我知道),但是有一个我可以使用的compressn函数,它会在最后给我一个32位的字符串但是可以还原吗?
编辑: 被编码的字符串是一个url,因此最多只有几百个字符,尽管在大多数情况下它会少很多。
谢谢
答案 0 :(得分:4)
你似乎想要两件不能共存的东西:
MD5哈希中只有这么多位,所以pigeonhole principle无法反转它。如果它是可逆的,你可以使用哈希无限压缩信息。此外,不可逆性是哈希的主要观点;它们的目的是成为单向函数。加密算法是可逆的,但需要更多的字节来存储密文,因为可解码意味着它们必须是无冲突的(两个明文不能编码为相同的密文,否则解码函数不会知道给定密文输出哪个明文)
答案 1 :(得分:4)
在我看来,你不是在寻找哈希或加密,而是在寻找压缩。试试zlib
和base64编码:
s = 'Hello, world'
encoded = zlib.compress(s).encode('base64')
编码数据的长度将随着输入的增长而增长,但它可能适合您。
即使将自己限制在URL,也无法将它们可逆地映射到32个字符的字符串,只有太多可能的URL。