golang并发计算文件md5效率优化 提供代码
下面是一个使用Go语言并发计算文件MD5的示例代码,其中利用了Goroutine和channel实现了并发计算和结果收集:
package main
import (
"crypto/md5"
"fmt"
"io"
"os"
"path/filepath"
)
type FileData struct {
Path string
MD5 string
Err error
}
func main() {
files := []string{"file1.txt", "file2.txt", "file3.txt"} // 要计算MD5的文件列表
fileDataChan := make(chan FileData)
// 开启Goroutine计算每个文件的MD5并将结果发送到channel
for _, file := range files {
go func(file string) {
fileData := FileData{Path: file}
f, err := os.Open(file)
if err != nil {
fileData.Err = err
fileDataChan <- fileData
return
}
defer f.Close()
h := md5.New()
if _, err := io.Copy(h, f); err != nil {
fileData.Err = err
fileDataChan <- fileData
return
}
fileData.MD5 = fmt.Sprintf("%x", h.Sum(nil))
fileDataChan <- fileData
}(file)
}
// 收集所有文件的MD5结果
fileDataList := make([]FileData, len(files))
for i := 0; i < len(files); i++ {
fileDataList[i] = <-fileDataChan
}
// 打印结果
for _, fileData := range fileDataList {
if fileData.Err != nil {
fmt.Printf("Failed to calculate MD5 of file %s: %s\n", fileData.Path, fileData.Err)
} else {
fmt.Printf("MD5 of file %s is %s\n", fileData.Path, fileData.MD5)
}
}
}
在上面的代码中,我们首先定义了一个FileData结构体来存储每个文件的路径、MD5值和任何可能的错误。然后,我们定义了一个fileDataChan通道来在Goroutine之间传递文件MD5的结果。
接下来,我们使用一个循环来遍历文件列表,并为每个文件开启一个Goroutine。在Goroutine中,我们首先打开文件并检查是否有错误。如果没有错误,我们使用io.Copy()函数将文件内容拷贝到MD5哈希计算器中,并计算哈希值。最后,我们将结果发送到fileDataChan通道中。
在Goroutine结束后,我们使用另一个循环来收集所有文件的MD5值。我们使用一个fileDataList切片来存储所有文件的MD5结果,并在每个Goroutine的结束时将结果添加到该切片中。最后,我们遍历所有文件的MD5结果,打印出文件名和对应的MD5值或错误信息。
通过使用并发计算文件MD5,我们可以大大提高计算效率,并在处理大量文件时节省时间。
原文地址: http://www.cveoy.top/t/topic/4T4 著作权归作者所有。请勿转载和采集!