Python:哈希函数始终为任何文件生成相同(空)的哈希

Python: Hash function always produces same (empty) hash for any file

所以我进行了大量的谷歌搜索,但无法真正找到我的问题的答案。 我试图制作一个函数来散列更大的文件,并且我制作了两个不同的函数,但对于我散列的任何文件,这两个函数似乎都产生相同的输出,准确地说:

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

我知道这是一个空字节字符串的 SHA256 哈希值。

我尝试使用的两种解决方案是:

from hashlib import sha256 as hashfun

bs = 1048576                   # I'll just use 1024kb chunks as an example
selectfile = "/PATH/TO/FILE"

with open(selectfile, 'rb') as f:
    for chunk in iter(lambda: f.read(bs), b''):
        hashfun().update(chunk)
    print(hashfun().hexdigest())

from hashlib import sha256 as hashfun

bs = 1048576
selectfile = "/PATH/TO/FILE"

with open(selectfile, 'rb') as f:
    while True:
        data = f.read(bs)
        if not data:
            break
        hashfun().update(data)
    print(hashfun().hexdigest())

这些似乎都不起作用。 我知道文件不是问题,因为之前没有块读取的简单函数有效:

from hashlib import sha256 as hashfun

selectfile = "/PATH/TO/FILE"

with open(selectfile, 'rb') as f:
    rbytes = f.read()
    readable_hash = hashfun(rbytes).hexdigest()
    print(readable_hash)

有什么非常明显的地方我做错了吗(可能是哈哈)? 提前致谢!

代码是重复调用哈希构造函数,而不是创建单个哈希实例并更新它。

这应该有效:

from hashlib import sha256 as hashfun

bs = 1048576                   # I'll just use 1024kb chunks as an example
selectfile = "/PATH/TO/FILE"
hash_ = hashfun()

with open(selectfile, 'rb') as f:
    for chunk in iter(lambda: f.read(bs), b''):
        hash_.update(chunk)
    print(hash_.hexdigest())