在散列中使用.digest()?

时间:2018-05-27 15:30:57

标签: python python-3.x

在此声明中使用.digest()有什么用?我们为什么用它 ?我在google上搜索过(还有documentation),但我仍然无法弄明白。

train_hashes = [hashlib.sha1(x).digest() for x in train_dataset]

我发现它转换为字符串。我是对还是错?

1 个答案:

答案 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()方法向其索取截至目前为止数据连接的摘要。

(大胆强调我的)。