java - 将二进制 SHA-1 摘要转换为十六进制字符串的奇怪算法

标签 java integer hex sha1

在互联网上我找到了这段代码来生成 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

最佳答案

字节有符号:它们可能是负数。当 Integer.toString() 处理负字节时,会生成一个以“FFFFFF”开头的字符串,但正字节不会发生这种情况,因此生成的字符串的长度不固定。 & 0xff 将字节转换为无符号整数。然后添加 0x100 以确保十六进制字符串长度为 3 个字符;这是必需的,因为我们希望每个字节都有 2 个十六进制数字的字符串,但 0 到 15 之间的字节只会产生 1 个字符。最后第三位数字被 substring(1) 丢弃。

我建议用 StringBuilder 代替 StringBuffer,因为它效率稍高,并且还可以指定初始缓冲区长度:

StringBuilder sb = new StringBuilder(result.length * 2);

关于java - 将二进制 SHA-1 摘要转换为十六进制字符串的奇怪算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16254245/

相关文章:

java - 递归地反转字符串

java - 以 Svg 形状写入缩放文本

java - 将 null 传递给重载方法

C - 从数组中删除重复项并将这些重复项存储在另一个数组中

java - 线程中的异常 "main"java.lang.NumberFormatException : For input string that's not null or empty

python - 如何将整数值映射到列表中的字符串?

c - 十六进制值作为字符串 C

swift 3 : Negative Int to hexadecimal

java - 如何在 Exoplayer 中暂停/恢复视频?

java - Java中的决策树节点方法