【问题标题】:SHA-1 a string (git-hash-object string)SHA-1 一个字符串(git-hash-object 字符串)
【发布时间】:2014-01-26 09:50:15
【问题描述】:

我正在尝试对以下字符串进行 SHA-1 加密:

commit 218\0tree 64a7513fad0b86d34b6feedbf9c2e99135819861 parent 233634213baf3f40236233f28c6646f20786a80a author CTF user <me@example.com> 1390678027 +0000 committer CTF user <me@example.com> 1390678027 +0000 Give me a Gitcoin 200

这是一个 git hash-object 输入,带有标题和提交消息。从一种方法到另一种方法,我得到的结果非常不同。

使用 git hash-object,我得到 bed6b1001619ad84548d05db65a75ac80bf79f31

使用 Ruby 的digest/sha1,我得到e729e36abf0fa4da392b8f2acc1561ec5d298af9

使用http://www.sha1-online.com,我得到d543ddbfb7607464f5f964b9a3536eccedd1e1a4

这非常令人困惑。它是哪一个?为什么我无法模仿git-hash-object 的功能?我阅读了http://git-scm.com/book/en/Git-Internals-Git-Objects 并按照那里的说明进行操作,但我似乎无法获得正确的哈希摘要。

这是我的红宝石 sn-p:

Digest::SHA1.hexdigest "commit #{body.length}\0#{body}"

在 git 中有没有办法查看 hash-object 标头,或者它用来散列 SHA-1 的字符串?我上面的方法有什么问题?

【问题讨论】:

  • 目前还不清楚您要解决什么问题。你可能想看看这个问题的答案 - stackoverflow.com/questions/552659/…
  • @D.Shawley 我正在尝试手动获取 git hash-object SHA-1 值,而不是使用 git-hash-object。我看了那个问题,我就是这么做的。
  • 你从哪里得到以tree 64a751... 开头的字符串?如果您要与实际的 git 提交进行比较,请注意提交数据包含嵌入的换行符,并不是全部都在一行中。
  • @torek 来自 git-write-tree。 tree 在一条线上,parent 在另一条线上,author 在另一条线上,committer 在另一条线上。然后有两个新行,然后是提交消息。有了这个,我得到了56e4a594dc02c21dfa82c237e3b8c53ed9c8f4c5 的 SHA-1。仍然不是bed6b..。知道我还缺少什么吗?
  • 啊,我的意思更像是,你git cat-file -p 是不是一个已知 ID 的实际提交。如果我把你的树、父母等放在一个文件中,我会得到一个至少 220 字节长的文件,包括所有换行符,它比指示的 218 长,所以我很确定这里有一些数据不同步.

标签: ruby git sha1 sha digest


【解决方案1】:

你好条纹夺旗选手:)

这就是你的做法(确保有换行符!)

require 'digest/sha1'

content = "tree #{tree}
parent #{parent}
author CTF user <me@example.com> #{timestamp} +0000
committer CTF user <me@example.com> #{timestamp} +0000

Give me a Gitcoin

1
"

Digest::SHA1.hexdigest "commit #{content.length}\0#{content}"

【讨论】:

  • 新行是问题:) 我在 bash 中犯了同样的错误。弄清楚了。谢谢!
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
相关资源
最近更新 更多