如何创建tarball以使其md5或sha512哈希值具有确定性?
我目前正在通过运行tar --exclude-vcs --create --verbose --dereference --gzip --file mycode.tgz *
创建源代码文件目录的tarball,并且我想记录它的哈希值,以便我可以将其用作检测未来变化的指纹。 / p>
但是,我注意到如果我在不更改任何文件的情况下创建重复的tarball,则在每个存档上运行Python hashlib.sha512(open('mycode.tgz').read()).hexdigest()
会返回不同的哈希值。
这是因为tar的压缩算法不确定吗?如果是这样,我如何有效地归档大量文件集合,以便我可以计算一致的散列来检测变化?
答案 0 :(得分:1)
可能会生成一个产生确定性哈希值的tar版本,但是大多数需要tar的哈希包装系统都使用pristine-tar之类的东西。不幸的是,pristine-tar对你的用例无济于事。
然而,Git版本控制系统非常擅长生成目录树的一致哈希(sha-1而不是sha-512)。
git add .
git write-tree
除非发生变化,否则将打印一致的哈希值。 将跟踪文件内容和模式更改。
答案 1 :(得分:1)
找到this question后,我意识到我的档案几乎完全相同,除了包含时间戳的前几个字节。将我的代码更改为hashlib.sha512(open(fn).read()[8:]).hexdigest()
以删除前几个字符以解决问题。
答案 2 :(得分:0)
shell glob可能会在文件添加到存档时改变文件的顺序。也许尝试用以下内容指定确切的顺序:
find . | sort | tar -T - --exclude-vcs --create --verbose --dereference --gzip --file mycode.tgz
答案 3 :(得分:0)