我必须在我所处的环境中使用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
在我的例子中,当文件被修改时,它首先变为空。此时,散列就是“空字符串散列”,应该忽略它。可以像这样声明空字符串(
b''
)的空哈希:相关问题 更多 >
编程相关推荐