使用Python3的hashlib.blake2b生成文件的散列时,这两种方法在功能上相似吗?

2024-06-16 11:16:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

传统方法的示例:

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编写的。我对:=如何工作的理解产生了以下结果:

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

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

nhd, nd = makeNormalHash()
fhd, fd = makeDifferentHash()

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

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

最终,我尝试创建一个python3.7友好的函数来替代walrus操作符(:=)

有什么想法吗

*Walrus运算符==赋值表达式PEP572


Tags: 文件方法readfoodefwithhashfile
1条回答
网友
1楼 · 发布于 2024-06-16 11:16:12

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

tempHash = hashlib.blake2b()
tempHash.update(b'')
emptyHash = tempHash.hexdigest()

相关问题 更多 >