無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

ファイルのメッセージダイジェストを計算する。

SHA1でファイルのメッセージダイジェストを計算するユーティリティを書きました。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.DigestException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * メッセージダイジェストを計算するユーティリティ。
 *
 * @version $Revision:$
 * @author  $Author:$
 */
public class MessageDigestUtil {

    /**
     * ファイルのメッセージダイジェストを計算する。
     * @param f ファイル
     * @return 計算したダイジェストの文字列表現
     * @throws NoSuchAlgorithmException アルゴリズムが存在しない場合。
     * @throws IOException 入出力例外が発生した場合
     * @throws DigestException ダイジェストの計算でエラーが発生した場合
     */
    public static final String digest( File f )
    throws NoSuchAlgorithmException, IOException, DigestException {
        InputStream in = null;
        try {
            in = new FileInputStream(f);
            return digest( in );
        } finally {
            if ( in != null ) {
                in.close();
            }
        }
    }
    /**
     * 入力ストリームからメッセージダイジェストを計算する。<br/>
     * <b>注:引数で指定された入力ストリームはクローズされません。</b>呼び出し元でクローズしてください。
     * @param in 入力ストリーム
     * @return 計算したダイジェストの文字列表現
     * @throws NoSuchAlgorithmException アルゴリズムが存在しない場合。
     * @throws IOException 入出力例外が発生した場合
     * @throws DigestException ダイジェストの計算でエラーが発生した場合
     */
    public static final String digest( InputStream in )
    throws NoSuchAlgorithmException, IOException, DigestException {
        MessageDigest sha = MessageDigest.getInstance("SHA-1");

        byte[] buff = new byte[1024];
        int length = in.read(buff);
        while ( length > 0 ) {
            sha.update( buff, 0, length);
            length = in.read(buff);
        }
        byte[] digest = sha.digest();
        return toHexString( digest );
    }

    /**
     * byte配列を16進数文字列に変換する。
     * @param digest byte配列
     * @return 変換した文字列
     */
    private static String toHexString ( byte[] digest ) {
        StringBuffer buff = new StringBuffer();
        for ( byte b : digest ) {
            buff.append( String.format("%1$02x", b) );
        }
        return buff.toString();
    }
}
テスト

試しに、このファイルのハッシュを計算してみます。

System.out.println( MessageDigestUtil.digest( new File( "./test.txt")) );

実行結果です。

d494a3a110257cf147c52769f5dc16a88a36c262

sha1sum にかけてみます。

$ sha1sum test.txt 
d494a3a110257cf147c52769f5dc16a88a36c262  test.txt

同じ結果になりました。期待通りです。

参考:Java 暗号化アーキテクチャ API の仕様およびリファレンス - MessageDigest オブジェクトの計算