首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用python3的hashlib.blake2b生成文件的哈希时,这两种方法在功能上相似吗?

在使用python3的hashlib.blake2b生成文件的哈希时,这两种方法在功能上相似吗?
EN

Stack Overflow用户
提问于 2020-12-12 03:21:29
回答 1查看 92关注 0票数 0

我必须在我所处的环境中使用Python3.7。有关如何使用hashlib.blake2b模块的常见教程显示了如何在读取要散列的文件块时使用'walrus‘

传统方法的示例:

代码语言:javascript
复制
def makeNormalHash():
    with open('fizzy.jpg', "rb") as f:
        file_hash = hashlib.blake2b()
        while chunk := f.read(8192):
            file_hash.update(chunk)
        hexdig = file_hash.hexdigest()
        dig = file_hash.digest()
        return hexdig,dig

:=运算符的这种用法让我有点困惑,但我尝试在这个用例中推断出它的最终结果功能,但它是为Python3.7而不是Python3.8编写的。我对:=工作原理的理解有以下几点:

代码语言:javascript
复制
def makeDifferentHash():
    with open('fizzy.jpg', "rb") as f:
        foo_hash = hashlib.blake2b()
        chunk = f.read(8192)
        while len(chunk) > 0:
            foo_hash.update(chunk)
            chunk = f.read(8192)
        foohexdig = foo_hash.hexdigest()
        foodig = foo_hash.digest()
        return foohexdig, foodig

乍一看,这似乎是一样的,但如果我在散列相同的文件时比较结果值,我会发现这些值不匹配。

代码语言:javascript
复制
nhd, nd = makeNormalHash()
fhd, fd = makeDifferentHash()

if(nhd != fhd):
    print('hexdig no match')
if(nd != fd):
    print('foodig no match')

我相信我应该期望在每次以相同的方式散列相同的文件时得到相同的结果值,这是为了确认文件是有效的和/或没有被篡改。所以我每次都使用相同的方法( blake2b ),但是我改变了遍历文件的方式。这是摘要值不匹配的原因吗?还是我遗漏了造成这种差异的哈希的另一个方面?

最终,我试图创建一个python3.7友好函数来取代海象运算符( := )的用法

有什么想法吗?

*海象运算符==赋值表达式PEP572

EN

回答 1

Stack Overflow用户

发布于 2021-05-13 04:11:31

在我的例子中,当文件被修改时,它首先是空的。在这一点上,散列是“空字符串散列”,应该被忽略。您可以像这样声明空字符串(b'')的空散列:

代码语言:javascript
复制
tempHash = hashlib.blake2b()
tempHash.update(b'')
emptyHash = tempHash.hexdigest()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65257369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档