git - 为什么 git hash-object 返回的哈希值与 openssl sha1 不同?

标签 git openssl sha1

上下文:我从 code.google 下载了 a file (Audirvana 0.7.1.zip) 到我的 Macbook Pro (Mac OS X 10.6.6)。

我想验证校验和,该特定文件的校验和发布为 862456662a11e2f386ff0b24fdabcb4f6c1c446a (SHA-1)。 git hash-object 给了我一个不同的哈希值,但是 openssl sha1 返回了预期的 862456662a11e2f386ff0b24fdabcb4f6c1c446a。

以下实验似乎排除了任何可能的下载损坏或换行差异,并表明实际上有两种不同的算法在起作用:

$ echo A > foo.txt
$ cat foo.txt
A
$ git hash-object foo.txt 
f70f10e4db19068f79bc43844b49f3eece45c4e8
$ openssl sha1 foo.txt 
SHA1(foo.txt)= 7d157d7c000ae27db146575c08ce30df893d3a64

这是怎么回事?

最佳答案

你会看到不同之处,因为 git hash-object 不只是对文件中的字节进行哈希处理——它在字符串“blob”之前加上文件大小和 NUL 到散列前的文件内容。 Stack Overflow 上的其他答案中有更多详细信息:

或者,为了说服自己,尝试类似的事情:

$ echo -n hello | git hash-object --stdin
b6fc4c620b67d95f953a5c1c1230aaab5db5a1b0

$ printf 'blob 5\0hello' > test.txt
$ openssl sha1 test.txt
SHA1(test.txt)= b6fc4c620b67d95f953a5c1c1230aaab5db5a1b0

关于git - 为什么 git hash-object 返回的哈希值与 openssl sha1 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290444/

相关文章:

git - 查询 git reflog 以获取对特定文件的所有提交

python - 通过 pygit2 执行 Git 瓷器命令?

c++ - 如何初始化 OpenSSL BIO 对象?

Java 使用 SHA1

c# - 将 C# SHA1 代码转换为 Golang

java - 增加发现哈希冲突的概率

python - Cookiecutter 创建的目录给我运行开发服务器和 python shell 的问题

Git 不会更新目录

x509 证书中的 Ruby 编码主题

javascript - 使用 JavaScript/OpenSSL 提取 SSL 证书的详细信息