LoginSignup
1
1

More than 3 years have passed since last update.

【Java】ハッシュユーティリティを列挙型とチェーンな感じで書いてみた

Last updated at Posted at 2021-03-28

0. INDEX

  • 概要
  • ハッシュユーティリティを書いてみた
  • あとがき

1. 概要

列挙型を使ってtypoしないぞ計画!
ってそこまで大層なものじゃないけど、いつものようにあれば使うよなって奴です。

2. ハッシュユーティリティを書いてみた

2.1. 動作サンプル

2.2. 使い方

こんな感じでupdate関数を繰り返せるチェーンメソッド仕様です。

String result = MessageDigestUtil.SHA256
    .update("hello".getBytes())
    .update("everyone".getBytes())
    .toHexString();

System.out.println(result);

2.3. ソースコード

MessageDigestUtil.java
package jp.go.mahny_conf.junk_memo;

import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * SHA-256とか生成するユーティリティ
 * @author mahny
 */
public enum MessageDigestUtil {
    MD2("MD2"),
    MD5("MD5"),
    SHA1("SHA-1"),
    SHA256("SHA-256"),
    SHA384("SHA-384"),
    SHA512("SHA-512"),
    ;

    private MessageDigest digest;

    /**
     * 初期化。使う側は意識しない箇所
     * @param algorithm アルゴリズム文字列
     */
    private MessageDigestUtil(String algorithm) {
        try {
            digest = MessageDigest.getInstance(algorithm);
        } catch (NoSuchAlgorithmException e) {
            // 引数のnull指定以外では出ないハズ
            throw new IllegalArgumentException("algorithmの指定が無い", e);
        }
    }

    /**
     * ハッシュに使用するデータを追加する
     * @param input 使用するデータ
     * @return ユーティリティオブジェクト
     */
    public MessageDigestUtil update(byte input) {
        digest.update(input);
        return this;
    }

    /**
     * ハッシュに使用するデータを追加する
     * @param input 使用するデータ
     * @return ユーティリティオブジェクト
     */
    public MessageDigestUtil update(byte[] input) {
        digest.update(input);
        return this;
    }

    /**
     * ハッシュに使用するデータを追加する
     * @param input 使用するデータ
     * @return ユーティリティオブジェクト
     */
    public MessageDigestUtil update(ByteBuffer input) {
        digest.update(input);
        return this;
    }

    /**
     * ハッシュを生成する
     * @return ハッシュデータ
     */
    public byte[] toBytes() {
        return digest.digest();
    }

    /**
     * ハッシュを生成し、16進数文字列で取得する
     * @return ハッシュデータ(16進数文字列)
     */
    public String toHexString() {
        StringBuilder result = new StringBuilder();
        for (byte data : toBytes()) {
            result.append(Integer.toHexString((data >> 4) & 0x0f));
            result.append(Integer.toHexString(data & 0x0f));
        }
        return result.toString();
    }
}

3. あとがき

列挙型ネタが続いていますが、今回は過去ネタの3番煎じくらいですが、もうちょっと使い勝手に踏み込んだユーティリティを作ってみました。

ちなみに、過去ネタ執筆時の列挙型の理解が浅かった頃は、文字列で定義して…

アルゴリズム定義
public static final String ALG_SHA256 = "SHA-256";
想定した使い方
byte[] hash = HashUtil.getHash(HashUtil.ALG_SHA256);

みたいな使い方を想定するんですが、これだと使い方を浸透させないと↓みたいにチームメイトが好き勝手しちゃうんですよね><

ッ!これは想定外ッ!!
byte[] hash = HashUtil.getHash("SHA-256");

使いたい時に直感的に使えるようにしておくのは、他人(未来の自分含む)の為にも大切だなと思う今日この頃です。

ではノシ

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1