0

String を取り込んで MD5 アルゴリズムでハッシュする単純なメソッドがあります (言うまでもなく、これらsysosはすべて、私が経験した奇妙な動作を監視/デバッグするためのものです):

private String hashMD5(String input) throws UnsupportedEncodingException, NoSuchAlgorithmException {
    MessageDigest digest = MessageDigest.getInstance("MD5");

    // BYTES_ENCODING == "UTF-8"
    digest.update(input.getBytes(BYTES_ENCODING), 0, input.length());

    System.out.println(new BigInteger(1, digest.digest()).toString(16));
    System.out.println(new BigInteger(1, digest.digest()).toString(16));
    System.out.println(new BigInteger(1, digest.digest()).toString(16));

    String hash = new BigInteger(1, digest.digest()).toString(16);
    System.out.println(hash + " : used hash");
    System.out.println(hash.length() + " - " + new BigInteger(1, digest.digest()).toString(16).length());
    return hash;
}

セット文字列でこのメソッドを呼び出すと、次のようになります。

02-18 08:49:23.355: I/System.out(2753): 78bfa0ce6d53a698a98aac899562bb4
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e
02-18 08:49:23.355: I/System.out(2753): d41d8cd98f00b204e9800998ecf8427e : used hash
02-18 08:49:23.355: I/System.out(2753): 32 - 32

ですから皆さんへの私の質問は次のとおりです。

最初BigIntegerのものは他のすべてのものと(長さと内容が)異なるのはなぜですか?

BigInteger両方のテスト デバイスで同じ動作が発生しています。適切な長さのハッシュを取得するには、少なくとも 2 つを作成する必要があります。

  1. ネクサス S (Android 4.1.1)
  2. ネクサス 7 (アンドロイド 4.2.2)
4

1 に答える 1

2

最初の digest.update() はダイジェストを更新しますが、MessageDigest インスタンスをリセットしないためです。出力される最初の結果は、 new BigInteger(1, digest.digest()).toString(16) と連結された input.getBytes(BYTES_ENCODING), 0, input.length()) のハッシュです。

digest.update(...) という行にコメントを付けます。

BigInteger.toString() は、バイト配列を 16 進数に変換するだけであることに注意してください。先行ゼロは追加されません。

String s = new BigInteger(1, digest.digest()).toString(16);
while (s.length()<16) s="0"+s; //or something else to the same effect
System.out.println(s);
于 2013-02-18T14:21:49.380 に答える