问题 为什么Git使用* compressed *对象的SHA1而不是原始对象的SHA1?


我只是好奇为什么做出这个选择 - 它基本上排除了改变Git使用的压缩算法 - 因为它不使用原始blob的SHA1。也许这里有一些效率考虑因素。也许ZLIB在压缩文件方面比SHA1算法在创建散列时更快,因此在散列之前压缩更快?

这是Linus原始Git README的链接: http://git.kernel.org/?p=git​​/git.git;a=blob;f=README;h=27577f76849c09d3405397244eb3d8ae1d11b0f3;hb=e83c5163316f89bfbde7d9ab23ca2e25604af290

以下是相关段落:

“内容可寻址集合中有几种对象 数据库。它们全部用zlib放气,并从它们的类型标签开始,以及有关数据的大小信息。 SHA1哈希始终是哈希值 压缩 对象,而不是原始对象。“


3263
2017-11-26 03:56


起源

你有没有考虑到它可能 允许 你改变算法?毕竟,如果你使用原始blob的sha1-sum,那么用zlib压缩的东西 相同 用bzip2压缩的对象将具有相同的sha1(一个碰撞),这是完全错误的。我不是说这很可能,但它实际上允许多种压缩方案的可能性。 - Chris Eberle
这根本不是错误的 - 压缩只是为了有效的存储和传输(人们会想到)。该 内容 重要的是 - 无论压缩机制如何,原始内容的SHA1都将保持不变。 - jds


答案:


就像你说的,它是 原版的 自述文件,当Git启动时。从那时起,它已被更改,以便在压缩之前计算SHA1。

值得注意的是用于命名对象的SHA-1哈希值   是原始数据加上此标题的哈希,所以'sha1sum'文件   与文件的对象名称不匹配。 (历史记录:在黎明   在git时代,哈希是压缩对象的SHA-1。

http://schacon.github.com/git/user-manual.html#object-details


14
2017-11-26 04:31



谢谢 - 我的印象是,提交和blob的内部表示从一开始就没有改变。很棒的答案! - jds