在此声明中使用.digest()有什么用?我们为什么用它 ?我在google上搜索过(还有documentation),但我仍然无法弄明白。
train_hashes = [hashlib.sha1(x).digest() for x in train_dataset]
我发现它转换为字符串。我是对还是错?
答案 0 :(得分:3)
.digest()
方法返回哈希设计用于生成的实际摘要。
这是一个单独的方法,因为散列API旨在接受多个部分的数据:
hash = hashlib.sha1()
for chunk in large_amount_of_data:
hash.update(chunk)
final_digest = hash.digest()
上面的代码创建了一个散列对象而没有传入任何初始数据,然后使用hash.update()
method将数据块放入循环中。这有助于避免将所有数据同时存储到内存中,因此如果您有权访问大型内容,则可以在1字节和整个Google索引之间散列任何内容。
如果hashlib.sha1(x)
直接生成摘要 ,则您永远不能首先添加其他数据。此外,还有另一种访问摘要的方法,使用hash.hexdigest()
method(相当于hash.digest().hex()
,但更方便)作为十六进制字符串。
您找到的代码使用哈希对象的构造函数也接受数据的事实;因为您想要哈希的所有数据都可以立即调用.digest()
。
module documentation以这种方式涵盖:
为每种类型的哈希命名了一个构造函数方法。全部返回具有相同简单接口的哈希对象。例如:使用
sha256()
创建SHA-256哈希对象。现在,您可以使用update()
方法为此对象提供类似字节的对象(通常为字节)。 在任何时候,您都可以使用digest()
或hexdigest()
方法向其索取截至目前为止数据连接的摘要。
(大胆强调我的)。