From 397526522d8b81a1485671146acb0ed58a6bfa98 Mon Sep 17 00:00:00 2001 From: Joshua Sjoding Date: Thu, 25 Feb 2016 10:13:13 -0800 Subject: Added Hasher for computing hashes of streamed objects --- core/hash.go | 29 ++++++++++++++++++++++------- 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") +} -- cgit