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)}