Golang 获取文件 md5 校验和的方法及效率比较
2016-11-17 17:16
519 查看
近期有一个需求:获取多个文件 md5 校验和判断是否存在重复文件,因为文件数量较多,有的文件还比较大,需要处理的文件还没有到位,我就考虑了一下效率的问题。目前我已知的 Golang 中获取 md5 校验和的方法有两个,这里直接给出实现源码。
还有可供参考的获取 md5 校验和的 Shell 命令
测试文件是公司项目的日志文件
下面效率展示
总结:
* 不管什么方法都会随着文件变大时间会变长,上面的例子大约都是2倍
*
====本文内容已完,宣传我的项目====
欢迎关注《休闲益智游戏》微信服务号
谢谢
package main import ( "crypto/md5" "flag" "fmt" "io" "io/ioutil" "os" ) var which = flag.Bool("which", true, "") var path = flag.String("path", "", "") var cnt = flag.Int("cnt", 100, "") func aaa() { f, err := os.Open(*path) if err != nil { fmt.Println("Open", err) return } defer f.Close() body, err := ioutil.ReadAll(f) if err != nil { fmt.Println("ReadAll", err) return } md5.Sum(body) //fmt.Printf("%x\n", md5.Sum(body)) } func bbb() { f, err := os.Open(*path) if err != nil { fmt.Println("Open", err) return } defer f.Close() md5hash := md5.New() if _, err := io.Copy(md5hash, f); err != nil { fmt.Println("Copy", err) return } md5hash.Sum(nil) //fmt.Printf("%x\n", md5hash.Sum(nil)) } func main() { flag.Parse() for i := 0; i < *cnt; i++ { if *which { aaa() } else { bbb() } } }
还有可供参考的获取 md5 校验和的 Shell 命令
md5 -- calculate a message-digest fingerprint (checksum) for a file md5 [-pqrtx] [-s string] [file ...]
测试文件是公司项目的日志文件
banjakukutekiiMac:shell panshiqu$ ls -an | grep by -rw-r--r-- 1 501 20 7285957 11 17 16:14 by.out banjakukutekiiMac:shell panshiqu$ cp by.out by2.out banjakukutekiiMac:shell panshiqu$ cat by.out >> by2.out banjakukutekiiMac:shell panshiqu$ ls -an | grep by -rw-r--r-- 1 501 20 7285957 11 17 16:14 by.out -rw-r--r-- 1 501 20 14571914 11 17 17:03 by2.out
下面效率展示
banjakukutekiiMac:shell panshiqu$ time ./gomd5 -cnt=1 -which=true -path="by.out" real 0m0.027s user 0m0.017s sys 0m0.012s banjakukutekiiMac:shell panshiqu$ time ./gomd5 -cnt=1 -which=true -path="by2.out" real 0m0.048s user 0m0.033s sys 0m0.018s banjakukutekiiMac:shell panshiqu$ time ./gomd5 -cnt=1 -which=false -path="by.out" real 0m0.018s user 0m0.012s sys 0m0.004s banjakukutekiiMac:shell panshiqu$ time ./gomd5 -cnt=1 -which=false -path="by2.out" real 0m0.031s user 0m0.024s sys 0m0.005s banjakukutekiiMac:shell panshiqu$ time md5 by.out MD5 (by.out) = 9d79e19a00cef1ae1bb6518ca4adf9de real 0m0.023s user 0m0.019s sys 0m0.006s banjakukutekiiMac:shell panshiqu$ time md5 by2.out MD5 (by2.out) = 0a029a460a20e8dcb00d032d6fab74c6 real 0m0.042s user 0m0.037s sys 0m0.009s
总结:
* 不管什么方法都会随着文件变大时间会变长,上面的例子大约都是2倍
*
io.Copy方法效率最高,建议大家这样使用
====本文内容已完,宣传我的项目====
欢迎关注《休闲益智游戏》微信服务号
谢谢
相关文章推荐
- java 获取文件长度的几种方法的效率比较
- iOS上获取文件md5的方法
- 获取图片文件尺寸效率比较
- [测试]java IO写入文件效率——几种方法比较
- iOS上获取大文件md5的方法
- Golang使用pkg-config自动获取头文件和链接库的方法
- Qt中QFtp获取带有中文的文件名称出现乱码的解决方法(比较巧妙,toLatin1压缩掉了QString自动给每个英文字符加上的那些00字节)
- Golang使用pkg-config自动获取头文件和链接库的方法
- 获取APK/签名文件的SHA1证书,MD5方法
- java的三种写文件方法的效率性能比较
- Golang不使用MD5比较文件内容是否一致
- Golang不使用MD5比较文件内容是否一致
- java的三种写文件方法的效率性能比较
- 获取文件Md5的方法
- fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较
- fgets与stream_get_line获取文件行数效率比较
- C中获取文件尾比较省事的方法
- C中获取文件尾比较省事的方法
- fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较
- java IO写入文件效率——几种方法比较