home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

Erlang/HowTo/GetMD5OrSHA1CheckSum

作成日: 2009-08-02 23:33:28   /   last updated at: 2009-08-02 23:58:53
カテゴリ: Erlang 

ファイル内容のMD5, SHA-1チェックサムを取得してみます。

MD5の場合(erlangモジュール)

MD5であれば、erlang:md5/1 を使う事で取得できます。

1> {ok, Data} = file:read_file("target_file.dat").
{ok,<<...>>}
2> erlang:md5(Data).
<<107,234,210,187,213,214,238,244,213,7,165,33,228,191,197,244>>

erlang:md5_init/0, md5_update/2, md5_final/1を組み合わせても可能です。

3> C1 = erlang:md5_init().
<<1,35,69,...>>
4> C2 = erlang:md5_update(C1, Data).
<<158,140,...>>
5> C3 = erlang:md5_final(C2).
<<107,234,210,187,213,214,238,244,213,7,165,33,228,191,197,244>>

得られたバイナリはerlang:md5/1と同一です。

ダウンロードファイルのチェックサムを確認したい場合などは、バイナリから16進数表記の文字列にして、チェックサムが書かれたサーバ側のファイルと中身を付き合わせる事になると思います。
・・・が。バイナリを簡単に16進表記にするショートカット関数が上手い事見つかりませんでした。

とりあえず確認したかったので、アルゴリズムもへったくれもない力業で済ませておきます。

6> lists:flatten(lists:map(fun(X) -> io_lib:format("~.16X", [X,""]) end, binary_to_list(C3))).
"6BEAD2BBD5D6EEF4D57A521E4BFC5F4"

Erlangの素人が無理矢理でっち上げた力業なので、真似しないで下さい(;・∀・)。

「プログラミング Erlang」のソースコードに、lib_md5.erlというモジュールが入ってまして、これのソースコードを見るともっとちゃんと「プログラミング」されてる16進数変換関数が書かれてます。実際はそちらを参考にするべきでしょう。

Amazon.co.jp: プログラミングErlang : Joe Armstrong, 榊原一矢: 本

SHA-1の場合(cryptoモジュール)

SHA-1についてはcryptoモジュールで提供されている sha/1, sha_init/0, sha_update/2, sha_final/1 を使って計算できました。sha/1の場合だけ載せます。

7> crypto:start().  % これをやっておかないとまずいらしい。
ok
8> C4 = crypto:sha1(Data).
<<149,229,83,86,245,217,56,145,166,127,215,161,123,238,204,31,131,12,10,86>>
9> crypto:stop().
ok

なお、crypto:md5/1, md5_init/0, md5_update/2, md5_final/1 というのもありまして、erlangモジュールでの結果と同じになります。


original url: https://www.glamenv-septzen.net/view/417