虽然这听起来像一个奇怪的想法,但它可能是Windows NTFS文件系统中一个很少使用但非常强大的属性的应用:文件流。
它允许在不改变默认流内容的情况下向文件添加多个流。例如:
echo foo > foo.text
echo bar > foo.text:alt
type foo.text
=> foo
more < foo.text:alt
=> bar
但是当列出目录时,你只能看到一个单独的文件:foo.txt
因此,在你的使用情况中,你可以将主流的哈希值写入名为hash
的流中,并在稍后将hash
流的内容与主流的哈希值进行比较。
只是一个备注:由于我不知道什么原因,type foo.text:alt
会生成以下错误:
"The filename, directory name, or volume label syntax is incorrect."
这就是为什么我的示例使用了MSDN上的使用流页面中推荐的more <
所以假设你有一个myhash
函数,它为文件提供哈希值(你可以通过使用hashlib
模块轻松构建一个):
def myhash(filename):
...
return hash_string
你可以做以下事情:
def store_hash(filename):
hash_string = myhash(filename)
with open(filename + ":hash") as fd:
fd.write(hash_string)
def compare_hash(filename):
hash_string = myhash(filename)
with open(filename + ":hash") as fd:
orig = fd.read()
return (hash_string == orig)
哈希函数
"即异或
的性质增加了一点复杂性。 如果你将文件中的所有字节xor
在一起形成一个值,那么将最后一个字节存储为value ^ 0xff
。 现在,当您读回文件以检查更改时,您可以检查所有字节(包括最后一个“幻数”字节)的xor
是否等于0xff
。 如果不是,则肯定有变化(如果是,那么变化可能很幸运-但这就是您仅使用8位检查的结果)。 此外,您可以将0xff
更改为任何所需的值(实际上0x00更有意义...) - dwanderson