2010-08-07 96 views
3

假设你有一个以base64编码的MD5散列。然后每个 字符只需要6位来存储 合成的22字节字符串(不包括结尾'==')中的每个字符。因此,每个 base64 md5散列可以缩小到6 * 22 = 132位,与原始位8 * 22 = 176 位字符串相比,这需要减少25%的内存空间。在Python中保存base64数据的最有效的内存方式?

是否有任何Python模块或函数可以让你以上述方式存储base64 数据?

+3

由于Base64是二进制的ASCII编码,为什么不直接存储为二进制?这不是最有效的方法吗? (看看http://docs.python.org/release/2.3/lib/module-base64.html - 特别是'decodestring'函数。) – David 2010-08-07 10:16:09

+0

我完全知道我可以生成一个专门为这个问题中的例子只有16个字节。但我并没有把这个问题限制在md5上。它适用于所有base64编码的数据。 – OTZ 2010-08-07 10:18:27

+0

顺便说一句,该文档页面可能是Python的错误版本......它只是我在Google上获得的第一批结果之一,而我没有正确检查它。 – David 2010-08-07 10:18:44

回答

1

David给出了一个适用于所有base64字符串的答案。

只需在base64模块中使用

base64.decodestring
即可。也就是,

import base64 
binary = base64.decodestring(base64_string)

是原始base64字符串的更高效的内存表示。如果您 在您的base64 MD5截断尾随“==”,使用它像

base64.decodestring(md5+'==')
7

存储base64编码数据的最有效方法是解码并将其存储为二进制文件。 base64是一种传输编码 - 存储数据是没有意义的,特别是在内存中,除非你有其他的令人信服的理由。

另外,nitpick:散列函数的输出不是十六进制字符串 - 这只是一个常见的表示形式。散列函数的输出是二进制数据的一些字节数。例如,如果您使用md5,sha或hashlib模块,则无需首先将其编码为任何内容 - 只需在散列对象上调用.digest()而不是.hexdigest()即可。

4

简单地以base64数据进行解码,以二进制:

>>> b64 = "COIC09jwcwjiciOEIWIUNIUNE9832iun" 
>>> len(b64) 
32 
>>> b = b64.decode("base64") 
>>> b 
'\x08\xe2\x02\xd3\xd8\xf0s\x08\xe2r#\x84!b\x144\x85\r\x13\xdf7\xda+\xa7' 
>>> len(b) 
24 
2

“店的base64数据”

不要。

做。不。商店。 Base64编码。数据。

Base64通过编码构建以使其变大。

存储原始东西。永远不要存储的base64编码

相关问题