2

私は Git パックファイルについて学んでおり、現在、パックファイル全体の SHA1 20 バイト チェックサムであると思われるものを (Java で) 再現しようとしています。「PACK」の 4 バイト ヘッダーから、最後にパッケージ化されたオブジェクトの圧縮データの末尾までのバイト配列を取得します。私が読んだものはすべて、次の 20 バイトがパックファイル全体の SHA1 チェックサムであることを示しています。

Git から受信したバイト配列の一部である 20 バイトのチェックサムは次のとおりです: B910248BF9B63AC53595E3835CA57BDAF08DA830

以下を使用して、独自の SHA1 チェックサムを計算します。
crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(testData);
byte [] result = crypt.digest();

私の結果は次のようになります: B910248BF9B63AC53595E3835CA57BDAF08DA813

結果の最後のバイトだけがGitのものと異なる可能性があることに困惑しています(バイトストリームの正しい部分を使用している場合)。唯一の問題が digest() に渡されるデータの範囲である場合、計算されたチェックサム全体が異なって見える可能性が高くなります。

何か案は?

4

2 に答える 2

0

JGit を使用します。

byte[] data = new byte[] { ... };
ObjectInserter.Formatter f = new ObjectInserter.Formatter();
ObjectId id = f.idFor(OBJ_BLOB, data);
String hash = id.getName();
于 2012-07-09T09:16:30.253 に答える