如何找到tarball的一致哈希值

时间:2013-12-05 23:35:49

标签: python hash tar

如何创建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的压缩算法不确定吗?如果是这样,我如何有效地归档大量文件集合,以便我可以计算一致的散列来检测变化?

4 个答案:

答案 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)

Gnu tar可以设置时间戳以实现一致的散列。

{{1}}

积分:https://stackoverflow.com/a/54908072