在 Ubuntu 等 Linux 或 Unix 系统中,md5sum 是用来计算和校验文件的工具.

MD5 全称 Message-DigestAlgorithm 5,报文摘要算法. 该算法对任意长度的信息进行逐位计算,产生一个二进制长度128位(十六进制长度32位)的校验和(或称“指纹”,“报文摘要”),不同的文件内容生成相同的报文摘要的概率是极其小的.

MD5 算法一般用于检查文件完整性,尤其常用于检测在网络文件传输、拷贝、磁盘错误或其他无恶意涉入的情况下文件的正确性.

md5sum 命令用于生成和校验文件的md5值. 会逐位对文件的内容进行校验,是文件的内容,与文件名无关. 也就是文件内容相同,其md5值相同. md5 值是一个128位的二进制数据,转换成16进制则是32(128/4)位的进制值. 比如,检验文件时,对比源文件和目标文件的 md5sum,如果一致,则认为文件是同一文件.

md5 校验,有很小的概率不同的文件生成的 md5 可能相同. 比md5更安全的校验算法还有SHA*系列的.

Linux命令之md5sum

注:

[1] - md5sum 是校验文件内容,与文件名是否相同无关.

[2] - md5sum值逐位校验,所以文件越大,校验时间越长.

1. md5sum 参数

用法:

md5sum [OPTION]... [FILE]...

作用:打印或校验 MD5(128-bit) 校验码(checksums).

md5sum --help
md5sum --version

参数:

[1] - -b, --binary, 以二进制模式读入文件内容.

[2] - -t, --text, 以文本模式读入文件内容(默认).

[3] - -c, --check, 根据已生成的 md5 值,校验已有文件.

[4] - --tag, 创建 BSD-style checksum.

[5] - --ignore-missing, 对于丢失文件不记录其状态(仅用于文件校验).

[6] - --quiet, 对于每个成功校验的文件不打印 OK(仅用于文件校验).

[7] - --status, 校验完成后,不输出错误或正确等提示信息(仅用于文件校验).

[8] - --strict , 对于格式不正确的 checksum 行,退出非零(exit non-zero)(仅用于文件校验).

[9] - -w, --warn, 对于格式不正确的 checksum 行,警告提示(仅用于文件校验).

2. md5sum 用例

2.1. 查看文件 md5 值

#用法:
md5sum file
md5sum * # 输出当前文件夹内所有文件的 md5 值.

#如
md5sum a361939080f540eca25bda3328d588fd.png
#输出:
#89c4f637d852200d653b59f9477e9a0e  a361939080f540eca25bda3328d588fd.png

md5sum 校验的是文件内容,与文件名无关.

可以文本模式或二进制模式读入文件并对其进行校验. 虽然是不同的读入模式,但是在进行求md5的时候,是一样的,都是逐位校验. 例如:

file a361939080f540eca25bda3328d588fd.png
#输出:
#a361939080f540eca25bda3328d588fd.png: PNG image data, 800 x 800, 8-bit colormap, non-interlaced

md5sum -b a361939080f540eca25bda3328d588fd.png
#89c4f637d852200d653b59f9477e9a0e *a361939080f540eca25bda3328d588fd.png
md5sum -t a361939080f540eca25bda3328d588fd.png
#89c4f637d852200d653b59f9477e9a0e  a361939080f540eca25bda3328d588fd.png

2.2. 单个文件的 md5 值保存到指定文件

将生成md5值保存到指定的文件,通常文件的扩展名会命为.md5(文本文件).

如:

#重定向 md5 值到文本文件.
md5sum a361939080f540eca25bda3328d588fd.png > a361939080f540eca25bda3328d588fd.png.md5
#查看.md5 文件内容
cat a361939080f540eca25bda3328d588fd.png.md5
#89c4f637d852200d653b59f9477e9a0e  a361939080f540eca25bda3328d588fd.pn

2.3. 多个文件的 md5 值保存到指定文件

将多个文件的md5 保存到指定的文件,每个文件的md5生成为一行.

如:

md5sum * >> out.md5

cat out.md5
#输出,每一行为一个文件.
#89c4f637d852200d653b59f9477e9a0e  a361939080f540eca25bda3328d588fd.png
#b5b6cbfe0083360e8391d06b834b4899  a361939080f540eca25bda3328d588fd.png.md5

2.4. md5 校验

根据已生成的md5来进行校验。生成当前文件的md5,并和之前已经生成的md5进行对比,如果一致,则返回OK,否则返回错误信息.

如:

md5sum -c out.md5
#输出
#a361939080f540eca25bda3328d588fd.png: OK
#a361939080f540eca25bda3328d588fd.png.md5: OK

md5sum -c --status out.md5 # 不打印任何信息

2.5. 与 grep 命令并用以校验多个文件

如:

md5sum -c out.md5 | grep -v OK #grep 命令过滤正确的信息
#输出:
#a361939080f540eca25bda3328d588fd.png.md5: FAILED
#md5sum: WARNING: 1 computed checksum did NOT match

3. Python库 hashlib 校验 md5 值

#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import hashlib

def md5sum(filename):
    f = open(filename, 'rb')
    md5 = hashlib.md5()
    while True:
        fb = f.read(8096)
        if not fb:
            break
        md5.update(fb)
    f.close()
    return (md5.hexdigest())

如:

md5sum("a361939080f540eca25bda3328d588fd.png")
#输出
#'89c4f637d852200d653b59f9477e9a0e'
Last modification:May 8th, 2019 at 05:53 pm