2011-03-22 5 views
2

나는 힘내 packfile에 대해 배우고 현재 (packable) 전체 packfile에 대한 SHA1 20 바이트 체크섬으로 생각하는 것을 재현하려고한다. "PACK"4 바이트 헤더에서 마지막 패키지 객체의 압축 데이터 끝까지 바이트 배열을 가져옵니다. 내가 읽은 모든 것은 다음 20 바이트가 전체 packfile에 대한 SHA1 체크섬임을 나타냅니다.git packfile sha1 checksum in java

힘내에서받은 바이트 배열의 일부인 20 바이트 체크섬은 다음과 같습니다
crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(testData);
byte [] result = crypt.digest();

내 결과로 끝 : 나는 내 자신의 SHA1 체크섬을 계산하려면 다음을 사용 B910248BF9B63AC53595E3835CA57BDAF08DA830

: B910248BF9B63AC53595E3835CA57BDAF08DA813

내 결과의 마지막 바이트 만 힘내 (바이트 스트림의 올바른 부분을 사용하는 경우)와 다를 수 있습니다. 유일한 문제가 digest()에 전달 된 데이터 범위라면 계산 된 전체 체크섬이 서로 다르게 보일 수 있습니다.

아이디어가 있으십니까?

+0

, 당신은 SHA-1과 거의 동일 얻을 것이 매우 가능성 (동일한 또는 완전히 달라야합니다). 이것은 많은 입력 파일과 일치합니까? 또한 jgit의 소스 코드를 어떻게 계산하는지 살펴 보자. – Thilo

+0

동일한 코드를 사용하여 포함 된 각 객체에 대한 테스트 SHA1 ID를 생성하고 트리 객체의 참조와 일치시킵니다. 이 문제는 현재 전체 packfile에 대한 체크섬 계산에만 관련됩니다. 별도의 간단한 프로젝트로 테스트 해보고 같은 문제가 있는지 확인하겠습니다. – madmarcos

답변

0

사용 JGit는 :

당신이 말하는 것처럼
byte[] data = new byte[] { ... }; 
ObjectInserter.Formatter f = new ObjectInserter.Formatter(); 
ObjectId id = f.idFor(OBJ_BLOB, data); 
String hash = id.getName();