技術者になりたい何か

技術者になりたい何かの覚書的な何かです

ファイルの同一性を確認するためのハッシュ値計算あれこれ

そのファイルほんとに同一ですか?ってときに使うハッシュ値による確認方法まとめ

■どんなときに使う?

インストールメディアとか、パッチとかが正しいものかの確認したいとき
でかいファイルの転送テストとかのときに、中断して再開して転送完了したけど、そのファイル壊れてないか確認したいとき

■種類

cksum CRC 基本32bit?
md5sum md5 128bit
sha1sum SHA1 160bit
sha256sum SHA256 256bit

他にも下記があって、それぞれ数字がbit長
sha224sum
sha256sum
sha384sum
sha512sum

当然ハッシュ値が長いほうが信頼性が高いです。
出力結果のハッシュ値が同一ならば、そのファイルは同一ですが、各アルゴリズムによって信頼性は変わります。
※短ければ短いほど衝突の可能性が高くなる
ので、確認したい対象と求められる正確性に応じて適宜適当なものを選ぶのが良い気がします。
※大量のファイルをチェックするなら衝突の可能性が一番高いcksumはやめたほうがいいけど、数個のファイルの同一性を確認したいときにそんなに衝突するかという話。

■実行結果と時間

対象をCentOSのインストール用ISO(DVD版)として、各コマンドでハッシュ値を計算してみます。
ついでにtimeコマンドで時間も測ってみます。

実行環境はメイン機のArch。

$ cat /proc/cpuinfo | grep 'model name'
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor
model name	: AMD Ryzen 5 1500X Quad-Core Processor

実行結果

$ time cksum CentOS-7-x86_64-DVD-1810.iso 
2792377078 4588568576 CentOS-7-x86_64-DVD-1810.iso

real	0m47.911s
user	0m15.538s
sys	0m1.453s
$ time md5sum CentOS-7-x86_64-DVD-1810.iso 
5b61d5b378502e9cba8ba26b6696c92a  CentOS-7-x86_64-DVD-1810.iso

real	0m47.165s
user	0m8.858s
sys	0m1.454s
$ 
$ time sha1sum CentOS-7-x86_64-DVD-1810.iso 
7ac72a080ce8ca79d39804f713684119b908941a  CentOS-7-x86_64-DVD-1810.iso

real	0m46.512s
user	0m3.903s
sys	0m1.766s
$ 
$ time sha256sum CentOS-7-x86_64-DVD-1810.iso 
6d44331cc4f6c506c7bbe9feb8468fad6c51a88ca1393ca6b8b486ea04bec3c1  CentOS-7-x86_64-DVD-1810.iso

real	0m48.070s
user	0m4.953s
sys	0m1.993s
$ 
$ 
$ time sha512sum CentOS-7-x86_64-DVD-1810.iso 
332cfc3593b091ac0e157a800fb1c1599f9f72e69441e46b50ed84f5ab053b7681ebf4ed660a6a8bfccbf8e3ae9266e3c6016f08439fc36e157ef7aa8be7b14a  CentOS-7-x86_64-DVD-1810.iso

real	0m53.131s
user	0m9.130s
sys	0m1.366s
$ 

意外と時間は変わりませんでした。
realが結構かかってるのは他のいろいろ作業しながらかもしれないけども。

スペックがアレなサーバ機でやってみます。

$ cat /proc/cpuinfo | grep 'model name'
model name	: AMD Athlon(tm) 64 X2 Dual Core Processor 4800+
model name	: AMD Athlon(tm) 64 X2 Dual Core Processor 4800+
$ 
$ time cksum CentOS-7-x86_64-DVD-1810.iso 
2792377078 4588568576 CentOS-7-x86_64-DVD-1810.iso

real	0m31.085s
user	0m19.724s
sys	0m3.812s
$ 
$ time md5sum CentOS-7-x86_64-DVD-1810.iso 
5b61d5b378502e9cba8ba26b6696c92a  CentOS-7-x86_64-DVD-1810.iso

real	0m30.702s
user	0m13.716s
sys	0m4.680s
$ 
$ time sha1sum CentOS-7-x86_64-DVD-1810.iso 
7ac72a080ce8ca79d39804f713684119b908941a  CentOS-7-x86_64-DVD-1810.iso

real	0m30.768s
user	0m19.320s
sys	0m4.420s
$ 
$ time sha256sum CentOS-7-x86_64-DVD-1810.iso 
6d44331cc4f6c506c7bbe9feb8468fad6c51a88ca1393ca6b8b486ea04bec3c1  CentOS-7-x86_64-DVD-1810.iso

real	0m40.900s
user	0m36.628s
sys	0m3.452s
$ 
$ time sha512sum CentOS-7-x86_64-DVD-1810.iso 
332cfc3593b091ac0e157a800fb1c1599f9f72e69441e46b50ed84f5ab053b7681ebf4ed660a6a8bfccbf8e3ae9266e3c6016f08439fc36e157ef7aa8be7b14a  CentOS-7-x86_64-DVD-1810.iso

real	0m30.863s
user	0m24.856s
sys	0m3.876s
$ 

これまた意外と時間変わりませんね。256より512が短くなってるのは何かのタイミングの問題でしょう。たぶん。

■ちなみに1

Linux系のインストールイメージとかは検証用に各DLページあたりにハッシュ値が書いてあることが多いです。
指定されたアルゴリズムでDL後のISOファイルを検証してね。
https://www.debian.org/CD/verify
https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7.1810?action=show&redirect=Manuals%2FReleaseNotes%2FCentOS7

■ちなみに2

opensslでも同じことができます。

$ openssl md5 CentOS-7-x86_64-DVD-1810.iso 
MD5(CentOS-7-x86_64-DVD-1810.iso)= 5b61d5b378502e9cba8ba26b6696c92a
$ 

使えるのは下記

$ openssl list -digest-commands
blake2b512        blake2s256        gost              md4               
md5               mdc2              rmd160            sha1              
sha224            sha256            sha3-224          sha3-256          
sha3-384          sha3-512          sha384            sha512            
sha512-224        sha512-256        shake128          shake256          
sm3               

$ 

実際のところ、簡単なファイル同一性確認ならcksumかmd5sum使うことが多いし、メディアやパッチの同一性確認ならDLページの指定形式使いますね。
ファイルの同一性の確認というだけならそんなにこだわらなくてもよいかと思います。

Sponsored Link