0

文字列をハッシュする小さなメソッドで作業しています。情報を探していると、ここで MessageDigest がこのタスクの作成に役立つことがわかりました。

バイト配列の SHA-1 を計算する

しかし今、私は質問があります。Java で文字列をハッシュする手順は常に同じようです。

  1. MessageDigester を作成し、使用するアルゴリズムを指定します。
  2. ハッシュする文字列で MessageDigester を更新します
  3. 次に、MessageDigester.digest を呼び出すと、byte[] が取得されます。

ハッシュの最もよく使用される関数の 1 つがこのハッシュの文字列バージョンを取得することである場合、なぜ (私が参照した質問やその他の質問で) convToHex メソッドを実装する必要があるのでしょうか?

private static String convToHex(byte[] data) {
            StringBuilder buf = new StringBuilder();
            for (int i = 0; i < data.length; i++) {
                int halfbyte = (data[i] >>> 4) & 0x0F;
                int two_halfs = 0;
                do {
                    if ((0 <= halfbyte) && (halfbyte <= 9))
                        buf.append((char) ('0' + halfbyte));
                    else
                            buf.append((char) ('a' + (halfbyte - 10)));
                    halfbyte = data[i] & 0x0F;
                } while(two_halfs++ < 1);
            }
            return buf.toString();
        }

MessageDigester によって返されたバイト [] と文字列の間でこの解析を行うことができる Java メソッドはありますか?? 存在する場合、どこにありますか?? そうでない場合、なぜ独自の方法を作成する必要があるのですか?

ありがとう。

4

1 に答える 1

3

You could use Commons Codec which has a Hex class. Apart from that you can write the conversion much shorter if you don't want to include another dependency:

private final static String HEX_CHARS = "0123456789ABCDEF";

@Override
public String toString() {
    String res = "";
    for(byte b : data) {
        res += HEX_CHARS.charAt((b >> 4) & 0xF);
        res += HEX_CHARS.charAt(b & 0xF);
    }
    return res;
}

(I know, I know, string concatenation in a loop, the byte arrays I have are of a fixed short length. Feel free to change it to use StringBuilder.)

于 2011-04-08T10:32:45.627 に答える