0

之前的问题被问到,读者被要求使用 hexdigest() 代替。...这确实有效。但是摘要格式的结构是什么?

以下测试代码:

import hashlib, base64
f1 = open('foo.jpeg', 'rb')    
m = hashlib.sha512()
m.update(f1.read())
sha = m.digest()
print(m.digest())
print(m.hexdigest())
res = base64.b64encode(sha)
print( res)

产生以下输出:

>>> 
b'\xf3g\xd1S\xc4#OK\xb8\xb7\x1f~r\xf0\x19JE\xb0d\xb9\x11O\x08\x1c\xc66\x00\xb3i*\x87\x08\x92+\xd3)F\x02\t\x80\xf0m\x8b;\x9c\xcdq\xbd\xb9\x92k\x7f}d\t\xc65\x12\x0b\x17\xf9]5\x97'

f367d153c4234f4bb8b71f7e72f0194a45b064b9114f081cc63600b3692a8708922bd32946020980f06d8b3b9ccd71bdb9926b7f7d6409c635120b17f95d3597
>>> 

我不明白上面输出的第一行中的“#OK”、“~r”、“i*”等部分是什么意思。任何可以对此有所了解的信息将不胜感激。当然,hexdigest() 输出非常有意义。

上一个问题是: hashlib.sha256 在 python 中返回了一些奇怪的字符。非常感谢。

4

2 回答 2

2

像 sha512 这样的哈希函数的输出是 512 位字符串或 64 字节字符串。因此结果m.digest是一个长度为 64 的字节对象。输出是伪随机的,因此散列中的“#OK”纯属巧合。的输出m.hexdigest是编码为十六进制数字的相同字节。

于 2013-08-11T16:57:42.483 回答
1

正如python参考所述:

hash.digest()

update()返回到目前为止传递给方法的字符串的摘要。这是一个digest_size字节串,可能包含非 ASCII 字符,包括空字节。

所以你看到的是到目前为止你的摘要的字节表示。

如果您查看ASCII 图表,您会发现某些字节可以表示为可打印字符。例如,摘要中的第二个字节(十六进制67)对字符进行编码g,而第一个字节(十六进制f3)不能表示为可打印字符,因此打印为\xf3.

于 2013-08-11T17:00:40.137 回答