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