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

时间:2015-08-16 19:08:05

标签: python hash md5

我需要获取对象的base64编码的MD5哈希,其中对象是存储为文件fname的图像。

我试过这个:

SetForegroundWindow

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

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()

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

(我后来需要base64编码的MD5哈希失败的操作失败了,我想这可能是原因。)

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

首先,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'

使用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。这留下了两个额外的必需符号和一个pading字符。 通常+/用作符号,但有变化。特别是因为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()是没有意义的。

答案 2 :(得分:0)

我正在为浏览器的 CSP 哈希生成带有 base64 编码的内联 javascript 哈希,因此上述接受的答案给出了以下错误。原因是,所有类型的字符串都没有正确处理。

<块引用>

AttributeError: 'bytes' 对象没有属性 'encode'

因为 Unicode 对象必须在散列之前进行编码。我在下面的代码中通过 inline.encode('utf-8') 对其进行编码。

要解决该问题,请使用以下方法。这就像一个魅力。

import hashlib
import base64

base64hash=base64.b64encode(hashlib.sha256(inline.encode('utf-8')).digest())
sha = "sha256-" + base64hash.decode("utf-8")
print(sha)

==> 这是为 base64 编码的字符串生成 sha256 哈希值。