我需要获取对象的base64编码的MD5哈希值,其中对象是存储为文件fname的图像.
我试过这个:
def get_md5(fname):
hash = hashlib.md5()
with open(fname) as f:
for chunk in iter(lambda: f.read(4096), ""):
hash.update(chunk)
return hash.hexdigest().encode('base64').strip()
Run Code Online (Sandbox Code Playgroud)
但是,我不认为这是正确的,因为它返回一个字符太多的字符串.我的理解是它需要24个字符长.我明白了
NjJiM2RlOWMzOTYxYmM3MDI5Y2Q1NzdjOTQ5YWRlYTQ=
Run Code Online (Sandbox Code Playgroud)
我也尝试过其他一些类似的方法,例如,一个不执行块循环的方法.它们都返回相同的字符串.
(我后来需要base64编码的MD5哈希的操作失败了,我想这可能是原因.)
我能够通过使用digest()而不是hexdigest()来使其工作.然后最后一行变为:
return hash.digest().encode('base64').strip()
Run Code Online (Sandbox Code Playgroud)
结果是24个字符长,并且它被Google云存储转移接受,它需要base64编码的MD5哈希.
首先,base64 编码使字符串更长。(在 Python 3 中使用 IPython 的示例):
In [1]: s = '123456789012345678901234'
In [2]: len(s)
Out[2]: 24
In [3]: import base64
In [4]: e = base64.b64encode(s.encode('utf8'))
In [5]: len(e)
Out[5]: 32
In [6]: e
Out[6]: b'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0'
Run Code Online (Sandbox Code Playgroud)
使用 base64 编码,每 6 位输入可以获得 8 位输出。
In [7]: 32/24
Out[7]: 1.333
In [8]: 8/6
Out[8]: 1.333
Run Code Online (Sandbox Code Playgroud)
base64 字母表使用 64(或 2**6)个不同的符号。通常它们包括小写和大写字母,数字 0-9。这留下了两个额外的必需符号和一个填充字符。通常+和/用作符号,但也有变化。特别是因为/在 UNIX 或 MS-Windows 文件名中是不允许的。
其次,使用十六进制表示会使字节串的长度加倍;一个字节的十六进制表示可以在 00 和 FF 之间变化。示例(再次使用 IPython 和 Python 3):
In [1]: import hashlib
In [2]: s = b'this is a simple test'
In [3]: len(hashlib.md5(s).digest())
Out[3]: 16
In [4]: len(hashlib.md5(s).hexdigest())
Out[4]: 32
Run Code Online (Sandbox Code Playgroud)
如果您无论如何都打算使用 base64 编码,那么使用hexdigest().
| 归档时间: |
|
| 查看次数: |
7030 次 |
| 最近记录: |