最近上传百度云的时候发现有极速秒传,从而了解到了文件哈希值。特此记录。
封面《金色ラブリッチェ》

前言

最近上传百度云的时候发现有个文件直接极速秒传了,像我这种一般不给百度云送钱的人是不太可能享用VIP功能的,因此查了查极速秒传的原理。

文件哈希

其实原理很简单,极速秒传只是因为你上传的文件在百度云里面有别人上传的一模一样的文件,因此只需要将别人上传给你的转存一份即可。那么如何判断文件是否一样呢,这就主要靠文件哈希值来判断。

哈希是一种从文件计算固定大小的位串值的算法。文件基本上包含数据块。哈希将此数据转换为更短的固定长度值或表示原始字符串的键值。哈希值可以被认为是该文件中所有内容的提炼摘要。

一个好的哈希算法会表现出一种称为雪崩效应的特性,即文件中的单个位或一个字节的数据发生变化,所产生的哈希输出也会显著改变。没有这样效果的哈希函数被认为具有较差的随机性,很容易被黑客破解。

这里我们来靠powershell里面的Get-FileHash函数来做个实验吧,Get-FileHash的文档在

先新建两个txt文件,并写入内容,其中只有一个h区分大小写

1
2
3
"hash" > test.txt
# h 变 H
"Hash" > test1.txt

然后我们使用Get-FileHash来计算两个文件的SHA256

1
2
3
# Get-FileHash 默认使用 SHA256
Get-FileHash test.txt | Format-List
Get-FileHash test1.txt | Format-List

结果如下,可以看到即使两个文件只有一个字母不一样,SHA256的值差的却非常的多。

除了SHA256以外,Get-FileHash还支持MD5SHA1SHA384SHA512。使用方法如下

1
Get-FileHash test1.txt -Algorithm MD5 | Format-List

总结

由于文件哈希的特性,比较两个文件是否一样往往不需要完全比较文件内的所有内容,只需要比较哈希值即可。比如在MSDN中下载文件,同时在详细信息页面里还会附上改文件的SHA1值,只需要对比就可以知道你下载的是否为同一文件,而不是被别人暗中修改的文件。

参考文献

计算文件哈希值

Get-FileHash

Introduction to Hashing and its uses