From ac8c18e7549d0392e4ab3c0ab29d4e6c14bc2480 Mon Sep 17 00:00:00 2001 From: amorozov Date: Tue, 25 Jun 2024 19:18:27 +0300 Subject: [PATCH] feature: added hasher --- pkg/io/crypto/hasher/hasher.go | 72 ++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 pkg/io/crypto/hasher/hasher.go diff --git a/pkg/io/crypto/hasher/hasher.go b/pkg/io/crypto/hasher/hasher.go new file mode 100644 index 0000000..811b0c3 --- /dev/null +++ b/pkg/io/crypto/hasher/hasher.go @@ -0,0 +1,72 @@ +package hasher + +import ( + "crypto/md5" + "crypto/sha256" + "hash" + "io" + "os" +) + +type Hasher struct { + HashSupplier func() hash.Hash +} + +func NewSha256Hasher() *Hasher { + return NewHasher(func() hash.Hash { + return sha256.New() + }, + ) +} + +func NewMd5Hasher() *Hasher { + return NewHasher(func() hash.Hash { + return md5.New() + }, + ) +} + +func NewHasher(hashSupplier func() hash.Hash) *Hasher { + return &Hasher{ + HashSupplier: hashSupplier, + } +} + +func (self *Hasher) GetFileHashString(fileLocation string) (string, error) { + bytes, err := self.GetFileHashBytes(fileLocation) + if err != nil { + return "", err + } + + return string(bytes), nil +} + +func (self *Hasher) GetFileHashBytes(fileLocation string) ([]byte, error) { + file, err := os.Open(fileLocation) + if err != nil { + return nil, err + } + defer file.Close() + + return self.GetHashBytes(file) +} + +func (self *Hasher) GetHashString(reader io.Reader) (string, error) { + bytes, err := self.GetHashBytes(reader) + if err != nil { + return "", err + } + + return string(bytes), nil +} + +func (self *Hasher) GetHashBytes(reader io.Reader) ([]byte, error) { + hasher := self.HashSupplier() + _, err := io.Copy(hasher, reader) + + if err != nil { + return nil, err + } + + return hasher.Sum(nil), nil +}