Browse Source

Merge "SHA1: support reset() and reuse instances"

stable-4.7
Jonathan Nieder 8 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
b24c8fca49
  1. 15
      org.eclipse.jgit.test/tst/org/eclipse/jgit/util/sha1/SHA1Test.java
  2. 2
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java
  3. 2
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java
  4. 4
      org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java
  5. 5
      org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java
  6. 32
      org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/SHA1.java

15
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/sha1/SHA1Test.java

@ -72,8 +72,13 @@ public class SHA1Test {
s.update(new byte[] {}); s.update(new byte[] {});
ObjectId s1 = ObjectId.fromRaw(s.digest()); ObjectId s1 = ObjectId.fromRaw(s.digest());
s.reset();
s.update(new byte[] {});
ObjectId s2 = s.toObjectId();
assertEquals(m1, s1); assertEquals(m1, s1);
assertEquals(exp, s1); assertEquals(exp, s1);
assertEquals(exp, s2);
} }
@Test @Test
@ -89,8 +94,13 @@ public class SHA1Test {
s.update(TEST1.getBytes(StandardCharsets.UTF_8)); s.update(TEST1.getBytes(StandardCharsets.UTF_8));
ObjectId s1 = ObjectId.fromRaw(s.digest()); ObjectId s1 = ObjectId.fromRaw(s.digest());
s.reset();
s.update(TEST1.getBytes(StandardCharsets.UTF_8));
ObjectId s2 = s.toObjectId();
assertEquals(m1, s1); assertEquals(m1, s1);
assertEquals(exp, s1); assertEquals(exp, s1);
assertEquals(exp, s2);
} }
@Test @Test
@ -106,7 +116,12 @@ public class SHA1Test {
s.update(TEST2.getBytes(StandardCharsets.UTF_8)); s.update(TEST2.getBytes(StandardCharsets.UTF_8));
ObjectId s1 = ObjectId.fromRaw(s.digest()); ObjectId s1 = ObjectId.fromRaw(s.digest());
s.reset();
s.update(TEST2.getBytes(StandardCharsets.UTF_8));
ObjectId s2 = s.toObjectId();
assertEquals(m1, s1); assertEquals(m1, s1);
assertEquals(exp, s1); assertEquals(exp, s1);
assertEquals(exp, s2);
} }
} }

2
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java

@ -169,7 +169,7 @@ public class DfsInserter extends ObjectInserter {
} }
long offset = beginObject(type, len); long offset = beginObject(type, len);
SHA1 md = SHA1.newInstance(); SHA1 md = digest();
md.update(Constants.encodedTypeString(type)); md.update(Constants.encodedTypeString(type));
md.update((byte) ' '); md.update((byte) ' ');
md.update(Constants.encodeASCII(len)); md.update(Constants.encodeASCII(len));

2
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ObjectDirectoryInserter.java

@ -140,7 +140,7 @@ class ObjectDirectoryInserter extends ObjectInserter {
return insert(type, buf, 0, actLen, createDuplicate); return insert(type, buf, 0, actLen, createDuplicate);
} else { } else {
SHA1 md = SHA1.newInstance(); SHA1 md = digest();
File tmp = toTemp(md, type, len, is); File tmp = toTemp(md, type, len, is);
ObjectId id = md.toObjectId(); ObjectId id = md.toObjectId();
return insertOneObject(tmp, id, createDuplicate); return insertOneObject(tmp, id, createDuplicate);

4
org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectInserter.java

@ -177,6 +177,8 @@ public abstract class ObjectInserter implements AutoCloseable {
} }
} }
private final SHA1 hasher = SHA1.newInstance();
/** Temporary working buffer for streaming data through. */ /** Temporary working buffer for streaming data through. */
private byte[] tempBuffer; private byte[] tempBuffer;
@ -217,7 +219,7 @@ public abstract class ObjectInserter implements AutoCloseable {
/** @return digest to help compute an ObjectId */ /** @return digest to help compute an ObjectId */
protected SHA1 digest() { protected SHA1 digest() {
return SHA1.newInstance(); return hasher.reset();
} }
/** /**

5
org.eclipse.jgit/src/org/eclipse/jgit/transport/PackParser.java

@ -117,6 +117,7 @@ public abstract class PackParser {
private byte[] hdrBuf; private byte[] hdrBuf;
private final SHA1 objectHasher = SHA1.newInstance();
private final MutableObjectId tempObjectId; private final MutableObjectId tempObjectId;
private InputStream in; private InputStream in;
@ -665,7 +666,7 @@ public abstract class PackParser {
JGitText.get().corruptionDetectedReReadingAt, JGitText.get().corruptionDetectedReReadingAt,
Long.valueOf(visit.delta.position))); Long.valueOf(visit.delta.position)));
SHA1 objectDigest = SHA1.newInstance(); SHA1 objectDigest = objectHasher.reset();
objectDigest.update(Constants.encodedTypeString(type)); objectDigest.update(Constants.encodedTypeString(type));
objectDigest.update((byte) ' '); objectDigest.update((byte) ' ');
objectDigest.update(Constants.encodeASCII(visit.data.length)); objectDigest.update(Constants.encodeASCII(visit.data.length));
@ -1023,7 +1024,7 @@ public abstract class PackParser {
private void whole(final long pos, final int type, final long sz) private void whole(final long pos, final int type, final long sz)
throws IOException { throws IOException {
SHA1 objectDigest = SHA1.newInstance(); SHA1 objectDigest = objectHasher.reset();
objectDigest.update(Constants.encodedTypeString(type)); objectDigest.update(Constants.encodedTypeString(type));
objectDigest.update((byte) ' '); objectDigest.update((byte) ' ');
objectDigest.update(Constants.encodeASCII(sz)); objectDigest.update(Constants.encodeASCII(sz));

32
org.eclipse.jgit/src/org/eclipse/jgit/util/sha1/SHA1.java

@ -63,12 +63,11 @@ public class SHA1 {
return new SHA1(); return new SHA1();
} }
// Magic initialization constants defined by FIPS180. private int h0;
private int h0 = 0x67452301; private int h1;
private int h1 = 0xEFCDAB89; private int h2;
private int h2 = 0x98BADCFE; private int h3;
private int h3 = 0x10325476; private int h4;
private int h4 = 0xC3D2E1F0;
private final int[] w = new int[80]; private final int[] w = new int[80];
/** Buffer to accumulate partial blocks to 64 byte alignment. */ /** Buffer to accumulate partial blocks to 64 byte alignment. */
@ -78,6 +77,27 @@ public class SHA1 {
private long length; private long length;
private SHA1() { private SHA1() {
init();
}
/**
* Reset this instance to compute another hash.
*
* @return {@code this}.
*/
public SHA1 reset() {
init();
length = 0;
return this;
}
private void init() {
// Magic initialization constants defined by FIPS180.
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
h4 = 0xC3D2E1F0;
} }
/** /**

Loading…
Cancel
Save