我必须在我所处的环境中使用Python3.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友好函数来取代海象运算符( := )的用法
有什么想法吗?
*海象运算符==赋值表达式PEP572
发布于 2021-05-13 04:11:31
在我的例子中,当文件被修改时,它首先是空的。在这一点上,散列是“空字符串散列”,应该被忽略。您可以像这样声明空字符串(b'')的空散列:
tempHash = hashlib.blake2b()
tempHash.update(b'')
emptyHash = tempHash.hexdigest()https://stackoverflow.com/questions/65257369
复制相似问题