auientの日常

ノンジャンルで書きたいことを書くブログ

ファイルチェックサムの取得コマンドまとめ

色んなOSでファイルチェックサムを取得するコマンドを調べる機会があったので、結果をメモしておく。

調べたOSは次の通り。

まとめ

コマンド AIX HP-UX RHEL Mac Win
sum o o o o x
cksum o o o o x
md5sum x ? o x x
csum o x x x x
md5 x x x o x
sha1sum x x o x x
openssl o o o o x
fciv x x x x o

sum

sum は古くからあるコマンドで、16ビットのチェックサムとブロック数を表示する。Unixには大体入っているが、BSD系とSystemV系では計算アルゴリズムが違うため互換性がないらしい。今あえて使うべきものではない。

cksum

cksum は sum の次に古いコマンドで、CRCチェックサムとファイルのバイト数を表示する。これもUnixには大体入っているが、CRCの計算方法がまちまちで互換性がない場合があるらしい。やはり今あえて使うべきものではない。

md5sum

md5sum は、入力ファイルに対するMD5チェックサムを表示する。RHELには最初から入っていたので、Linuxユーザーにはポピュラーなのだと思う。ネットで配布されるファイルにはMD5チェックサムがついていることが多い。(最近は、SHA1が主流になりつつあるみたいだが。)
またmd5sumは、チェックサムを表示するだけでなく、自身の出力結果を書いたファイルを読み込んで各ファイルに対応するチェックサムを確認する機能がある。(-cオプション)diffや目で確認する必要がないので地味に楽である。

# 出力例
$ md5sum /path/to/file.txt 
745dcdd3ddd4200fbab28f92f73120fc  /path/to/file.txt 

なおHP-UXでは md5sumはアドオンとして提供されているようで、自分の使った環境には入っていなかった。

csum

csum も、MD5チェックサムを表示するコマンドである。これはAIXに特有のコマンドのようだ。md5sumとまったく同じフォーマットで表示を行うが、オプションや細かな動作は異なる。また、-iオプションで入力ファイルを指定することで、チェックサムを確認する機能もある。

ちなみに、md5sumはディレクトリが入力されるとエラーになるが、csumはmd5sumと違ってディレクトリのチェックサムも表示する。inodeの情報を入力にしているのだろうか。いずれにせよ役に立たない機能である。

md5

md5 は、Macに入っているMD5チェックサム計算コマンド。確認機能はない。FreeBSDにも入っているのかもしれないが確証はない。
デフォルトではLinuxのmd5sumと出力形式が違うが、-rオプションをつけるとmd5sum風の出力に変わる。diffを取る時には役に立つ。

# 出力例
$ md5 /path/to/file.txt 
MD5 (/path/to/file.txt) = 745dcdd3ddd4200fbab28f92f73120fc
# -rをつけると形式がmd5sum風に変わる
$ md5 -r /path/to/file.txt 
745dcdd3ddd4200fbab28f92f73120fc /path/to/file.txt 

sha1sum

sha1sum は、ファイルのSHA1チェックサムを表示するコマンド。入っていたのはLinuxだけだった。使い方はmd5sumと同じである。

openssl

openssl はたくさんの機能をもったコマンドなのだが、dgstサブコマンドによってチェックサムの計算ができる。MacLinuxだけでなく、AIXHP-UXにも入っていた。OpenSSHの前提ソフトウェアなので、sshをインストールする際に一緒に入ったのかもしれない。いずれにせよ、今の時代sshはあちこちで使われているので、汎用的に使えるコマンドだと思って間違いはない。
opensslはMD5だけでなくSHA1などのチェックサムも計算することができる。

$ openssl dgst -md5 /path/to/file.txt 
MD5(/path/to/file.txt)= 745dcdd3ddd4200fbab28f92f73120fc
$ openssl dgst -sha1 /path/to/file.txt 
SHA1(/path/to/file.txt)= d008ba248c66d93c2cc51447b09b081e500f2845

ただし、見て分かるように出力形式がMacmd5と同じ。つまりLinuxのmd5sumと違う。diffを取るときにちょっと不便である。というわけで、opensslの結果を整形するsedコマンドを書いた。パイプ以降をコピペすればdiffで比較できるようになる。

$ openssl dgst -md5 file.txt | sed -e 's/^.*(\(.*\))= \(.*\)$/\2  \1/'
745dcdd3ddd4200fbab28f92f73120fc  file.txt
# awkでもいいぞ!
$ openssl dgst -md5 file.txt | awk '{gsub(/^.*\(|\)=/,"");print $2"  "$1}'
745dcdd3ddd4200fbab28f92f73120fc  file.txt

ファイル名に(や)が含まれていると上手く動かない予感がするが、その点はご了承いただきたい。

fciv

fciv は、Windows向けのチェックサム計算コマンド。Microsoft製。MD5SHA1を計算でき、確認機能もあるみたいだが使ったことはない。出力形式はmd5sumと似ているが、ヘッダとフッタがついてしまうのが余計。これはデフォルトではインストールされないので、下記URL等からダウンロードする必要がある。