MD5怎么这么快?加密/ MD5

时间:2017-03-24 13:22:04

标签: c bash unix go md5

我需要为大量文件计算哈希值(md5没问题)。所以,在Go中我有这段代码:

package main

import (
    "io"
    "os"
    "fmt"
    "path/filepath"

    "crypto/md5"
    "encoding/hex"
)

func strSliceRemove(slice []string, str string) []string {
    var tempSlice []string;

    for _, item := range slice {
        if item != str {
            tempSlice = append(tempSlice, item)
        }
    }

    return tempSlice
}

func fileMD5(path string) (string, error) {
    var returnMD5String string
    file, err := os.Open(path)

    if err != nil {
        return returnMD5String, err
    }
    defer file.Close()

    hash := md5.New()

    if _, err := io.Copy(hash, file); err != nil {
        return returnMD5String, err
    }

    hashInBytes := hash.Sum(nil)[:16]
    returnMD5String = hex.EncodeToString(hashInBytes)

    return returnMD5String, nil
}

func main() {
    var doRead func(string)

    doRead = func(sd string) {
        filepath.Walk(sd, func(path string, f os.FileInfo, err error) error {
            resolvedPath, resolvedPathErr := filepath.EvalSymlinks(path)
            if resolvedPathErr != nil {
                return nil
            }

            if f.Mode()&os.ModeSymlink == os.ModeSymlink {
                doRead(resolvedPath)
            } else {
                if !f.IsDir() {
                    md5, _ := fileMD5(path)
                    fmt.Printf("%s\n", md5)
                }
            }

            return nil
        })
    }

    doRead("/tmp/electron")
    return
}

它几乎在一秒钟内正确散列1400个文件。如果我使用我的OSX md5命令行实用程序,则需要10倍以上的时间。它慢了10倍:

for FILE in `find /tmp/electron`; do
    if [ ! -d "$FILE" ]; then
        md5 $FILE;
    fi;
done;

我尝试了一个相同的基本c程序(基于这个答案How to calculate the MD5 hash of a large file in C?),但时间似乎差不多10秒。

crypto / md5使用什么样的策略/库?

0 个答案:

没有答案
相关问题