github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xhash/hash.go (about)

     1  package xhash
     2  
     3  import (
     4  	"crypto/md5"
     5  	"crypto/sha1"
     6  	"crypto/sha256"
     7  	"fmt"
     8  	"io"
     9  	"os"
    10  
    11  	"github.com/codingeasygo/util/xio"
    12  )
    13  
    14  func MD5(data []byte) string {
    15  	h := md5.New()
    16  	h.Write(data)
    17  	return fmt.Sprintf("%x", h.Sum(nil))
    18  }
    19  
    20  func SHA1(data []byte) string {
    21  	h := sha1.New()
    22  	h.Write(data)
    23  	return fmt.Sprintf("%x", h.Sum(nil))
    24  }
    25  
    26  func SHA256(data []byte) string {
    27  	h := sha256.New()
    28  	h.Write(data)
    29  	return fmt.Sprintf("%x", h.Sum(nil))
    30  }
    31  
    32  func SHA512(data []byte) string {
    33  	h := sha256.New()
    34  	h.Write(data)
    35  	return fmt.Sprintf("%x", h.Sum(nil))
    36  }
    37  
    38  func ReaderHash(reader io.Reader, enableSHA1, enableMD5 bool) (shah, md5h string, filesize int64, err error) {
    39  	h1 := sha1.New()
    40  	writer := []io.Writer{}
    41  	if enableSHA1 {
    42  		writer = append(writer, h1)
    43  	}
    44  	h2 := md5.New()
    45  	if enableMD5 {
    46  		writer = append(writer, h2)
    47  	}
    48  	filesize, err = xio.CopyMulti(writer, reader)
    49  	if enableSHA1 {
    50  		shah = fmt.Sprintf("%x", h1.Sum(nil))
    51  	}
    52  	if enableMD5 {
    53  		md5h = fmt.Sprintf("%x", h2.Sum(nil))
    54  	}
    55  	return
    56  }
    57  
    58  func FileHash(filename string, enableSHA1, enableMD5 bool) (shah, md5h string, filesize int64, err error) {
    59  	f, err := os.Open(filename)
    60  	if err == nil {
    61  		shah, md5h, filesize, err = ReaderHash(f, enableSHA1, enableMD5)
    62  		f.Close()
    63  	}
    64  	return
    65  }