Hash 文件
当我们从网络上下载得到一个文件,尤其是一个大文件时,,你会不会常常发现这一个一个问题:文件打不开!你会不会疑惑,明明从网上下载的文件好好的,怎么会出现文件错误,打不开呢?
文件的完整性
我们提到文件,尤其是大文件的下载的时候,我们常常会提到 P2P 或者是 磁力链。
- P2P:P2P,也就是Peer-to-Peer的简称。以这种协议传输,每个电脑都会提供一份力量。文件被分成很多个小块,每台电脑都会提供一部分小块的上传和下载。
- 磁力链:磁力链和P2P类似,但是P2P需要一个中心服务器来告诉各个电脑有谁有文件,而磁力链则会自动找最近的有文件的服务器。
这两种方式都有一个问题,那就是文件被分割成小块在互联网上传输。如果其中一块出了问题,那整个文件都不可是使用了。所以我们需要一个方法来验证文件的完整度。
目前主流下载软件是已经包含了验证文件完整度的流程的,不需要再次验证
Hash(哈希)
hash本质上就是一个函数,他的输入是一串二进制,输出为一串字符。我们就称呼这串字符为 文件哈希(file hash) 或者 验证符(checksums)。一个理想的hash函数应该满足独一性,即每个独特的文件只能产生一个文件哈希,以至于任何一个微小的改变都会改变文件哈希的值。
目前有很多的hash算法,包括SHA-256
,SHA3
,SHA1
,MD5
和CRC32
。但是目前这些算法都不是绝对安全的(也就是说,有可能两个文件会产生同样的哈希),不过在日常生活中他们已经常用来验证文件的完整性。
这里不对各个Hash算法的原理进行深入研究,如果有需求可以看看知乎专栏进行了解。
在mac上验证文件Hash
mac目前提供命令行指令来看文件的hash值:
显示SHA256哈希:
shasum -a 256 [filenames]
显示SHA1哈希:
shasum -a 1 [filenames]
显示MD5哈希:
md5 -r [filenames]
显示CRC32哈希:
crc32 [filenames]
有时候我们下载时会提供包含hash的验证文件。我们称呼这些文件为验证文件(checksums files)。一个验证文件(checksums file)一般包含多行hash-文件名对。你可以用一行指令轻松的验证所包含的所有文件。当有多个文件时,这个指令很管用。
注意:验证文件必须与内部提到的文件在同一个文件夹
验证SHA256文件(通常文件名是 SHA256SUMS):
shasum -a 256 -c [SHA256SUMS]
验证SHA1文件(通常文件名是 SHA1SUMS):
shasum -a 1 -c [SHA1SUMS]
mac不提供原生的MD5验证指令,但可以从Homebrew
轻松下载:
brew install md5sha1sum
- 验证MD5文件(通常文件名是 MD5SUMS):
md5sum -c [MD5SUMS]
创建验证文件
我们也可以生成自己的验证文件,可以用于日后的验证或者拷贝大型文件的完整性验证
shasum -a 256 [files] > [SHA256SUMS]
注意:SHA256对大型文件的处理速度比较慢,需要耐心等待
日常使用
在一些文件下载网站,如MSDN,里面的软件是会提供下载后验证SHA1的,我们可以下载之后验证文件的完整性。
同时,有时候路边购买的U盘,也可能出现信息丢失的情况,我们也可以用这种方式验证文件完整性。
另外,对于大型的文档,我们在确定终稿的时候生成SHA文件,可以避免对文件的修改过于细微而无法确认文件的完备性。当然,最好还是用Git进行版本管理。