packwiz/core/hash.go

49 lines
1.1 KiB
Go

package core
import (
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"crypto/sha512"
"encoding/binary"
"encoding/hex"
"fmt"
"github.com/packwiz/packwiz/curseforge/murmur2"
"hash"
"strconv"
"strings"
)
// GetHashImpl gets an implementation of hash.Hash for the given hash type string
func GetHashImpl(hashType string) (hash.Hash, HashStringer, error) {
switch strings.ToLower(hashType) {
case "sha1":
return sha1.New(), hexStringer{}, nil
case "sha256":
return sha256.New(), hexStringer{}, nil
case "sha512":
return sha512.New(), hexStringer{}, nil
case "md5":
return md5.New(), hexStringer{}, nil
case "murmur2":
return murmur2.New(), numberStringer{}, nil
}
return nil, nil, fmt.Errorf("hash implementation %s not found", hashType)
}
type HashStringer interface {
HashToString([]byte) string
}
type hexStringer struct{}
func (hexStringer) HashToString(data []byte) string {
return hex.EncodeToString(data)
}
type numberStringer struct{}
func (numberStringer) HashToString(data []byte) string {
return strconv.FormatUint(uint64(binary.BigEndian.Uint32(data)), 10)
}