2

インターネットで、SHA1 ハッシュを生成する次のコードを見つけました。

        public static String hash(String str) {
            try {
                    MessageDigest mg = MessageDigest.getInstance("SHA-1");
                    byte[] result = mg.digest(str.getBytes());
                    StringBuffer sb = new StringBuffer();
                    for (int i = 0; i < result.length; i++) {
                            sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
                    }
                    return sb.toString();
            } catch (NoSuchAlgorithmException e) {
                    System.err.println("SHA-1 not found.");
                    return "";
            }
    }

しかし、なぜそこにあるの(result[i] & 0xff) + 0x100ですか?

4

2 に答える 2

6

バイトは符号付きです: 負になる可能性があります。負のバイトが処理さInteger.toString()れると、"FFFFFF" で始まる文字列が生成されますが、これは正のバイトでは発生しないため、結果の文字列の長さは固定されません。は& 0xffバイトを符号なし整数に変換します。次に、16 進文字列が 3 文字の長さになるように 0x100 が追加されます。これが必要なのは、各バイトに 2 桁の 16 進数の文字列が必要なためですが、0 から 15 までのバイトは 1 文字しか生成しないからです。最後に で 3 桁目を破棄しsubstring(1)ます。

StringBuffer を StringBuilder に置き換えることをお勧めします。これは、少し効率的であり、初期バッファー長を指定することもできるためです。

StringBuilder sb = new StringBuilder(result.length * 2);
于 2013-04-27T16:40:09.403 に答える