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");
使いたい時に直感的に使えるようにしておくのは、他人(未来の自分含む)の為にも大切だなと思う今日この頃です。
ではノシ