Python,获取图像obj的base64编码MD5哈希

2024-05-17 07:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要得到一个对象的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()

但是,我不认为这是正确的,因为它返回的字符串包含太多字符。我的理解是它需要24个字符长。我明白了

NjJiM2RlOWMzOTYxYmM3MDI5Y2Q1NzdjOTQ5YWRlYTQ=

我也尝试过其他一些类似的方法,例如,不做块循环的方法。它们都返回相同的字符串。

(我以后需要base64编码的MD5散列的操作失败了,我想这就是原因所在。)


Tags: 文件对象方法字符串图像编码getdef
2条回答

首先,base64编码使字符串更长。(将IPython与Python 3结合使用的示例):

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'

使用base64编码,每6位输入可获得8位输出。

In [7]: 32/24
Out[7]: 1.333

In [8]: 8/6
Out[8]: 1.333

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

如果您无论如何都要使用base64编码,那么使用hexdigest()是没有意义的。

我可以通过使用digest()而不是hexdigest()来实现它。最后一行变成:

return hash.digest().encode('base64').strip()

结果是24个字符长,被googlecloudstoragetransfer接受,它需要一个base64编码的MD5散列。

相关问题 更多 >