Golang中如何计算文件的唯一值:MD5和Hash方法

发表时间: 2024-05-29 20:40

计算文件的md5值

// Md5File return the md5 value of filefunc Md5File(filename string) (string, error) {    if fileInfo, err := os.Stat(filename); err != nil {        return "", err    } else if fileInfo.IsDir() {        return "", nil    }    file, err := os.Open(filename)    if err != nil {        return "", err    }    defer file.Close()    hash := md5.New()    chunkSize := 65536    for buf, reader := make([]byte, chunkSize), bufio.NewReader(file); ; {        n, err := reader.Read(buf)        if err != nil {            if err == io.EOF {            break            }        		return "", err        }    hash.Write(buf[:n])    }    checksum := fmt.Sprintf("%x", hash.Sum(nil))    return checksum, nil}/* 效率高的方式 */func Md5File2(filepath string) string {    file, err := os.Open(filepath)    if err != nil {        return ""    }    defer file.Close()    m := md5.New()    _, err = io.Copy(m, file)    if err != nil {        return ""    }    return hex.EncodeToString(m.Sum(nil))}func main() {    str, err := Md5File("version.txt") // 计算文件的hash值    if err != nil {    fmt.Println(err)    }    fmt.Println(str)    str = Md5File2("version.txt") // 计算文件的hash值    fmt.Println(str)}

计算文件的hash值--sha1

package mainimport (    "crypto/sha1"    "fmt"    "io"    "log"    "os")func main() {    file, err := os.Open("main.go")    defer file.Close()    if err != nil {    		fmt.Errorf("读取文件失败!")    }    hash := sha1.New()    if _, err := io.Copy(hash, file); err != nil {        log.Fatal(err)    }    sum := hash.Sum(nil)    fmt.Printf("%x\n", sum)}

计算文件的hash值--sha256

package mainimport (    "crypto/sha256"    "fmt"    "io"    "log"    "os")func main() {    file, err := os.Open("main.go")    defer file.Close()    if err != nil {        fmt.Errorf("读取文件失败!")    }    hash := sha256.New()    if _, err := io.Copy(hash, file); err != nil {        log.Fatal(err)    }    sum := hash.Sum(nil)    fmt.Printf("%x\n", sum)}