Python,获取图像对象的base64编码的MD5哈希值

use*_*003 10 python hash md5

我需要获取对象的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哈希的操作失败了,我想这可能是原因.)

use*_*003 9

我能够通过使用digest()而不是hexdigest()来使其工作.然后最后一行变为:

return hash.digest().encode('base64').strip()
Run Code Online (Sandbox Code Playgroud)

结果是24个字符长,并且它被Google云存储转移接受,它需要base64编码的MD5哈希.

  • 在 python 3 中,这不起作用:`*** AttributeError: 'bytes' 对象没有属性 'encode'`。这有效:`导入base64;base64.b64encode(h.digest()).decode()` (5认同)

Rol*_*ith 8

首先,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().