package starcrypto import ( "crypto/md5" "crypto/sha1" "crypto/sha256" "crypto/sha512" "encoding/hex" "errors" "hash" "hash/crc32" "io" "os" ) // SumAll 可以对同一数据进行多种校验 func SumAll(data []byte, method []string) (map[string][]byte, error) { result := make(map[string][]byte) methods := make(map[string]hash.Hash) var iscrc bool if len(method) == 0 { method = []string{"sha512", "sha256", "sha384", "sha224", "sha1", "crc32", "md5"} } sum512 := sha512.New() sum384 := sha512.New384() sum256 := sha256.New() sum224 := sha256.New224() sum1 := sha1.New() crcsum := crc32.NewIEEE() md5sum := md5.New() for _, v := range method { switch v { case "md5": methods["md5"] = md5sum case "crc32": iscrc = true case "sha1": methods["sha1"] = sum1 case "sha224": methods["sha224"] = sum224 case "sha256": methods["sha256"] = sum256 case "sha384": methods["sha384"] = sum384 case "sha512": methods["sha512"] = sum512 } } for _, v := range methods { v.Write(data) } if iscrc { crcsum.Write(data) } for k, v := range methods { result[k] = v.Sum(nil) } if iscrc { result["crc32"] = crcsum.Sum(nil) } return result, nil } // FileSum 输出文件内容校验值,method为单个校验方法,小写 // 例:FileSum("./test.txt","md5",shell(pect float64){fmt.Sprintf("已完成 %f\r",pect)}) func FileSum(filepath, method string, shell func(float64)) (string, error) { var sum hash.Hash var sum32 hash.Hash32 var issum32 bool var result string fp, err := os.Open(filepath) if err != nil { return "", err } switch method { case "sha512": sum = sha512.New() case "sha384": sum = sha512.New384() case "sha256": sum = sha256.New() case "sha224": sum = sha256.New224() case "sha1": sum = sha1.New() case "crc32": sum32 = crc32.NewIEEE() issum32 = true case "md5": sum = md5.New() default: return "", errors.New("Cannot Recognize The Method:" + method) } writer := 0 stat, _ := os.Stat(filepath) filebig := float64(stat.Size()) if !issum32 { // if _, err := io.Copy(sum, fp); err != nil { for { buf := make([]byte, 1048574) n, err := fp.Read(buf) if err != nil { if err == io.EOF { break } return result, err } writer += n pect := (float64(writer) / filebig) * 100 go shell(pect) sum.Write(buf[0:n]) } result = hex.EncodeToString(sum.Sum(nil)) } else { for { buf := make([]byte, 1048574) n, err := fp.Read(buf) if err != nil { if err == io.EOF { break } return result, err } writer += n pect := (float64(writer) / filebig) * 100 go shell(pect) sum32.Write(buf[0:n]) } result = hex.EncodeToString(sum32.Sum(nil)) } return result, nil } // FileSumAll 可以对同一文件进行多种校验 func FileSumAll(filepath string, method []string, shell func(float64)) (map[string]string, error) { result := make(map[string]string) methods := make(map[string]hash.Hash) var iscrc bool if len(method) == 0 { method = []string{"sha512", "sha256", "sha384", "sha224", "sha1", "crc32", "md5"} } fp, err := os.Open(filepath) defer fp.Close() if err != nil { return result, err } stat, _ := os.Stat(filepath) filebig := float64(stat.Size()) sum512 := sha512.New() sum384 := sha512.New384() sum256 := sha256.New() sum224 := sha256.New224() sum1 := sha1.New() crcsum := crc32.NewIEEE() md5sum := md5.New() for _, v := range method { switch v { case "md5": methods["md5"] = md5sum case "crc32": iscrc = true case "sha1": methods["sha1"] = sum1 case "sha224": methods["sha224"] = sum224 case "sha256": methods["sha256"] = sum256 case "sha384": methods["sha384"] = sum384 case "sha512": methods["sha512"] = sum512 } } writer := 0 for { buf := make([]byte, 1048574) n, err := fp.Read(buf) if err != nil { if err == io.EOF { break } return result, err } writer += n pect := (float64(writer) / filebig) * 100 go shell(pect) for _, v := range methods { v.Write(buf[0:n]) } if iscrc { crcsum.Write(buf[0:n]) } } for k, v := range methods { result[k] = hex.EncodeToString(v.Sum(nil)) } if iscrc { result["crc32"] = hex.EncodeToString(crcsum.Sum(nil)) } return result, nil }