怎样计算大文件的MD5

zhaohao · 2017-03-28 07:09:44 · 4714 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-03-28 07:09:44 的主题,其中的信息可能已经有所发展或是发生改变。

小文件可以这样,但是大文件怎么办????

package main

import (
    "crypto/md5"
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
    "sort"
)

// MD5All读取文件目录root下所有文件,并返回从文件路径到文件内容MD5值的映射。如果扫描目录
// 出错或者任何操作失败,MD5All返回失败。
func MD5All(root string) (map[string][md5.Size]byte, error) {
    m := make(map[string][md5.Size]byte)
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if info.IsDir() {
            return nil
        }
        data, err := ioutil.ReadFile(path)
        if err != nil {
            return err
        }
        m[path] = md5.Sum(data)
        return nil
    })
    if err != nil {
        return nil, err
    }
    return m, nil
}

func main() {
    // 计算指定目录下所有文件的MD5值,之后按照目录名排序并打印结果
    m, err := MD5All(os.Args[1])
    if err != nil {
        fmt.Println(err)
        return
    }
    var paths []string
    for path := range m {
        paths = append(paths, path)
    }
    sort.Strings(paths)
    for _, path := range paths {
        fmt.Printf("%x  %s\n", m[path], path)
    }
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4714 次点击  
加入收藏 微博
3 回复  |  直到 2017-07-06 08:17:26
alalmn
alalmn · #1 · 8年之前

这个问题我之前也遇到了 文件分割读取(分块读取) 可以交流下GO 我QQ:29295842

alalmn
alalmn · #2 · 8年之前

上G的分块读取都可以

dophin
dophin · #3 · 8年之前
f, _ = os.Open(path)
h := md5.New()
io.Copy(h, f)
m[path] = h.Sum(nil)
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传