之前的问题被提出并且读者被要求使用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
>>>
我没有得到像#34;#OK"," ~r"," i *"等于上面第一行的输出。任何可以解决这个问题的光都将非常感激。当然,hexdigest()输出非常有意义。
上一个问题是:hashlib.sha256在python中返回了一些奇怪的字符。 非常感谢。
答案 0 :(得分:2)
像sha512这样的散列函数的输出是512位字符串或64字节字符串。因此m.digest
的结果是长度为64的字节对象。输出是伪随机的,因此散列中的“#OK”纯粹是巧合。 m.hexdigest
的输出是与十六进制数字相同的字节。
答案 1 :(得分:1)
正如python reference所述:
hash.digest()
返回到目前为止传递给
update()
方法的字符串的摘要。这是一个digest_size
字节的字符串,可能包含非ASCII字符,包括空字节。
所以你看到的是你的摘要到目前为止的字节表示。
如果您查看ASCII chart,您会看到某些字节可以表示为可打印字符。例如,摘要中的第二个字节(十六进制67
)对字符g
进行编码,而第一个字节(十六进制f3
)不能表示为可打印字符,因此打印出来为\xf3
。