util/md5.go

164 lines
2.9 KiB
Go
Raw Permalink Normal View History

2021-01-09 22:59:27 +08:00
package util
import (
2024-01-23 23:02:08 +08:00
"crypto/md5"
"encoding/hex"
"errors"
"hash"
"io"
"os"
"path/filepath"
"strings"
2021-01-09 22:59:27 +08:00
)
2024-01-18 22:34:19 +08:00
const MD5ResultLength = 16
type MD5Result struct {
2024-01-23 23:02:08 +08:00
result [MD5ResultLength]byte
err error
2024-01-18 22:34:19 +08:00
}
func (m *MD5Result) Array() [MD5ResultLength]byte {
2024-02-19 16:46:42 +08:00
if m.err != nil {
return [MD5ResultLength]byte{}
}
2024-01-23 23:02:08 +08:00
return m.result
2024-01-18 22:34:19 +08:00
}
func (m *MD5Result) Slice() []byte {
2024-02-19 16:46:42 +08:00
if m.err != nil {
return []byte{}
}
2024-01-23 23:02:08 +08:00
return m.result[:]
2024-01-18 22:34:19 +08:00
}
func (m *MD5Result) Upper() string {
2024-02-19 16:46:42 +08:00
if m.err != nil {
return ""
}
2024-01-23 23:02:08 +08:00
return strings.ToUpper(hex.EncodeToString(m.result[:]))
2024-01-18 22:34:19 +08:00
}
func (m *MD5Result) Lower() string {
2024-02-19 16:46:42 +08:00
if m.err != nil {
return ""
}
2024-01-23 23:02:08 +08:00
return strings.ToLower(hex.EncodeToString(m.result[:]))
2024-01-18 22:34:19 +08:00
}
func (m *MD5Result) Error() error {
2024-01-23 23:02:08 +08:00
return m.err
2024-01-18 22:34:19 +08:00
}
func NewMD5Result(result []byte, err error) *MD5Result {
2024-01-23 23:02:08 +08:00
res := &MD5Result{
result: [MD5ResultLength]byte{},
err: err,
}
copy(res.result[:], result)
return res
2024-01-18 22:34:19 +08:00
}
type MD5 struct{}
2024-01-19 10:48:33 +08:00
func NewMD5() *MD5 {
2024-01-23 23:02:08 +08:00
return &MD5{}
2024-01-19 10:48:33 +08:00
}
func (m *MD5) FromReader(r io.Reader) *MD5Result {
2024-01-23 23:02:08 +08:00
ha := md5.New()
if _, err := io.Copy(ha, r); err != nil {
return NewMD5Result(nil, err)
}
hashInBytes := ha.Sum(nil)
if len(hashInBytes) != MD5ResultLength {
return NewMD5Result(nil, errors.New("wrong length"))
}
return NewMD5Result(hashInBytes, nil)
2024-01-18 22:34:19 +08:00
}
2024-01-23 21:12:04 +08:00
func (m *MD5) FromFile(filename string) *MD5Result {
2024-01-23 23:02:08 +08:00
file, err := os.Open(filepath.Clean(filename))
if err != nil {
return NewMD5Result(nil, err)
}
defer func() {
_ = file.Close()
}()
return m.FromReader(file)
2024-01-18 22:34:19 +08:00
}
2024-01-19 10:48:33 +08:00
func (m *MD5) FromReaderChunk(r io.Reader, chunksize int) *MD5Result {
2024-01-23 23:02:08 +08:00
buf := make([]byte, chunksize)
m5 := md5.New()
var n int
var err error
for {
n, err = r.Read(buf)
if err != nil {
if err != io.EOF {
return NewMD5Result(nil, err)
}
if n > 0 {
_, err = m5.Write(buf[:n])
if err != nil {
return NewMD5Result(nil, err)
}
}
break
}
_, err = m5.Write(buf[:n])
if err != nil {
return NewMD5Result(nil, err)
}
}
return NewMD5Result(m5.Sum(nil), nil)
2024-01-19 01:36:33 +08:00
}
2024-01-23 21:12:04 +08:00
func (m *MD5) FromFileChunk(filename string, chunksize int) *MD5Result {
2024-01-23 23:02:08 +08:00
file, err := os.Open(filepath.Clean(filename))
if err != nil {
return NewMD5Result(nil, err)
}
defer func() {
_ = file.Close()
}()
return m.FromReaderChunk(file, chunksize)
2024-01-18 22:34:19 +08:00
}
2024-01-19 10:48:33 +08:00
func (m *MD5) FromBytes(b []byte) *MD5Result {
2024-01-23 23:02:08 +08:00
res := md5.Sum(b)
return NewMD5Result(res[:], nil)
2024-01-18 22:34:19 +08:00
}
2024-01-19 10:48:33 +08:00
func (m *MD5) FromString(str string) *MD5Result {
2024-01-23 23:02:08 +08:00
res := md5.Sum([]byte(str))
return NewMD5Result(res[:], nil)
2024-01-18 22:34:19 +08:00
}
type MD5Pip struct {
2024-01-23 23:02:08 +08:00
md5 hash.Hash
2024-01-18 22:34:19 +08:00
}
func NewMD5Pip() *MD5Pip {
2024-01-23 23:02:08 +08:00
return &MD5Pip{md5: md5.New()}
2024-01-18 22:34:19 +08:00
}
2024-01-19 01:36:33 +08:00
func (m *MD5Pip) Write(data []byte) (n int, err error) {
2024-01-23 23:02:08 +08:00
return m.md5.Write(data)
2024-01-19 01:36:33 +08:00
}
func (m *MD5Pip) WriteBytes(data []byte) error {
2024-01-23 23:02:08 +08:00
_, err := m.Write(data)
return err
2024-01-18 22:34:19 +08:00
}
func (m *MD5Pip) WriteString(data string) error {
2024-01-23 23:02:08 +08:00
_, err := m.Write([]byte(data))
return err
2024-01-18 22:34:19 +08:00
}
func (m *MD5Pip) Result() *MD5Result {
2024-01-23 23:02:08 +08:00
return NewMD5Result(m.md5.Sum(nil), nil)
2021-01-09 22:59:27 +08:00
}