2011-03-22 30 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();