2011-03-22 26 views
2

我正在学习Git packfile,并且正在尝试重现(使用Java)我认为是整个packfile的SHA1 20字节校验和。 我从包括“PACK”4字节标头的字节数组到最后一个打包对象的压缩数据的末尾。我读过的所有内容都表明接下来的20个字节是整个packfile的SHA1校验和。在java中计算git packfile sha1校验和

的20个字节的校验和,它是从Git的接收字节数组的部分是: B910248BF9B63AC53595E3835CA57BDAF08DA830

我用以下方法来计算自己的SHA1校验码:
crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(testData);
byte [] result = crypt.digest();

我的结果呢?如下: B910248BF9B63AC53595E3835CA57BDAF08DA813

我很困惑我的结果的最后一个字节如何可能不同于Git的(如果我使用的是字节流的正确部分)。 如果唯一的问题是传递给digest()的数据范围,那么整个计算的校验和很可能看起来不一样。

任何想法?

+0

正如你所说的,极不可能的,你会得到一个SHA-1几乎是相同的(应该是相同或完全不同)。这与许多输入文件一致吗?另外,请看看jgit的来源,他们是如何计算它的。 – Thilo 2011-03-22 03:02:57

+0

我使用相同的代码为每个包含对象生成测试SHA1标识,并且它们与树对象中的引用相匹配。目前这个问题只涉及计算整个packfile的校验和。我将用一个单独的,更简单的项目来测试它,看看我是否有同样的问题。 – madmarcos 2011-03-22 09:15:51

回答

0

使用JGit:

byte[] data = new byte[] { ... }; 
ObjectInserter.Formatter f = new ObjectInserter.Formatter(); 
ObjectId id = f.idFor(OBJ_BLOB, data); 
String hash = id.getName();