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 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'core/hash.go') 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 +} -- cgit