如何计算文件散列?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (47)

存储在树对象中的SHA 1散列(由git ls-tree)与文件内容的SHA 1散列不匹配(如sha1sum)

$ git cat-file blob 4716ca912495c805b94a88ef6dc3fb4aff46bf3c | sha1sum
de20247992af0f949ae8df4fa9a37e4a03d7063e  -

如何计算文件散列?它在计算哈希之前压缩内容吗?

提问于
用户回答回答于

Git将对象前缀为“blob”,后面是长度(作为人类可读的整数),后面是nul字符。

$ echo -e 'blob 14\0Hello, World!' | shasum 8ab686eafeb1f44702738c8b0f24f2567c36da6d

用户回答回答于

  • 第一步。在存储库中创建一个空文本文档(名称不重要)
  • 第二步。阶段和提交文档
  • 第三步。通过执行git ls-tree HEAD
  • 第四步。找到这个小块的散列e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
  • 第五步。从惊讶中惊醒,阅读下面的内容

git如何计算它的提交散列?

    Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)

正文blob⎵是一个常量前缀,并且\0也是常量,并且是NULL性格。大<size_of_file><contents_of_file>根据文件的不同而有所不同。

这都是大家的事!

但是等等!,你有没有注意到<filename>不是用于哈希计算的参数吗?如果两个文件的内容与创建日期、时间和名称无关,则它们可能具有相同的散列。这是Git比其他版本控制系统更好地处理移动和重命名的原因之一。

自己动手(Ext)

  • 第六步。使用不同的方法创建另一个空文件filename在同一个目录中
  • 第七步。比较两个文件的散列。

注:

该链接没有提到tree对象被散列。我不确定算法和参数,但是从我的观察来看,它可能是根据所有的blobstrees(它们的散列可能)。

扫码关注云+社区