diff options
author | Joshua Sjoding <joshua.sjoding@scjalliance.com> | 2016-02-25 10:13:13 -0800 |
---|---|---|
committer | Joshua Sjoding <joshua.sjoding@scjalliance.com> | 2016-02-25 10:13:13 -0800 |
commit | 397526522d8b81a1485671146acb0ed58a6bfa98 (patch) | |
tree | 3b96f28ce8196f290522dd8983a4965fdbd090f0 | |
parent | 5bc563727ffa798caee3b007c366eb66c3d69caa (diff) | |
download | go-git-397526522d8b81a1485671146acb0ed58a6bfa98.tar.gz |
Added Hasher for computing hashes of streamed objects
-rw-r--r-- | core/hash.go | 29 | ||||
-rw-r--r-- | core/hash_test.go | 7 |
2 files changed, 29 insertions, 7 deletions
diff --git a/core/hash.go b/core/hash.go index 9b30b6e..c50ffb2 100644 --- a/core/hash.go +++ b/core/hash.go @@ -3,6 +3,7 @@ package core import ( "crypto/sha1" "encoding/hex" + "hash" "strconv" ) @@ -14,13 +15,9 @@ var ZeroHash Hash // ComputeHash compute the hash for a given ObjectType and content func ComputeHash(t ObjectType, content []byte) Hash { - h := t.Bytes() - h = append(h, ' ') - h = strconv.AppendInt(h, int64(len(content)), 10) - h = append(h, 0) - h = append(h, content...) - - return Hash(sha1.Sum(h)) + h := NewHasher(t, int64(len(content))) + h.Write(content) + return h.Sum() } // NewHash return a new Hash from a hexadecimal hash representation @@ -41,3 +38,21 @@ func (h Hash) IsZero() bool { func (h Hash) String() string { return hex.EncodeToString(h[:]) } + +type Hasher struct { + hash.Hash +} + +func NewHasher(t ObjectType, size int64) Hasher { + h := Hasher{sha1.New()} + h.Write(t.Bytes()) + h.Write([]byte(" ")) + h.Write([]byte(strconv.FormatInt(size, 10))) + h.Write([]byte{0}) + return h +} + +func (h Hasher) Sum() (hash Hash) { + copy(hash[:], h.Hash.Sum(nil)) + return +} diff --git a/core/hash_test.go b/core/hash_test.go index 8c4ed67..782777e 100644 --- a/core/hash_test.go +++ b/core/hash_test.go @@ -33,3 +33,10 @@ func (s *HashSuite) TestIsZero(c *C) { hash = NewHash("8ab686eafeb1f44702738c8b0f24f2567c36da6d") c.Assert(hash.IsZero(), Equals, false) } + +func (s *HashSuite) TestNewHasher(c *C) { + content := "hasher test sample" + hasher := NewHasher(BlobObject, int64(len(content))) + hasher.Write([]byte(content)) + c.Assert(hasher.Sum().String(), Equals, "dc42c3cc80028d0ec61f0a6b24cadd1c195c4dfc") +} |