Java sha256哈希函数中三个字节中的两个不同

Java sha256哈希函数中三个字节中的两个不同,java,hash,sha,sha256,Java,Hash,Sha,Sha256,我正在使用此函数计算SHA 256 public static String getSHA1(String plainText) { MessageDigest md; try { md = MessageDigest.getInstance("SHA-256"); md.update(plainText.getBytes(Charset.forName("UTF-8"))); String

我正在使用此函数计算SHA 256

public static String getSHA1(String plainText) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-256");

            md.update(plainText.getBytes(Charset.forName("UTF-8")));
            StringBuffer hexString = new StringBuffer();
            byte[] bytes = md.digest();
            for (int i = 0; i < bytes.length; i++) {
                hexString.append(Integer.toHexString(0xFF & bytes[i]));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
网站结果 我的代码结果 下面是更多的例子:

7777777
8C1CDB9CB4DBAC6DBB6EBD118EC8F9523D22E4E4CB8CC9DF5F7E1E499BBA3C10
8c1cdb9cb4dbac6dbb6ebd118ec8f9523d22e4e4cb8cc9df5f7e1e499bba3c10


147258
7A2EC40FF8A1247C532309355F798A779E00ACFF579C63EEC3636FFB2902C1AC
7a2ec4ff8a1247c53239355f798a779e0acff579c63eec3636ffb292c1ac


888888
92925488B28AB12584AC8FCAA8A27A0F497B2C62940C8F4FBC8EF19EBC87C43E
92925488b28ab12584ac8fcaa8a27af497b2c6294c8f4fbc8ef19ebc87c43e
我知道这是关于编码的
可能
。但是看,我使用了utf-8,这是网站使用的

这就是问题所在:

hexString.append(Integer.toHexString(0xFF & bytes[i]));
这将丢失任何前导0-换句话说,任何小于16的字节将显示为一个十六进制数字,而不是两个

有很多方法可以解决这个问题。例如:

  • 如果值介于0和15之间,则手动追加
    0
    (单击)
  • 使用
    String.format(“%02x”,字节[i]&0xff)
  • 在实用程序库中使用完整的“字节数组到十六进制转换”方法(周围有负载)
    • 这就是问题所在:

      hexString.append(Integer.toHexString(0xFF & bytes[i]));
      
      这将丢失任何前导0-换句话说,任何小于16的字节将显示为一个十六进制数字,而不是两个

      有很多方法可以解决这个问题。例如:

      • 如果值介于0和15之间,则手动追加
        0
        (单击)
      • 使用
        String.format(“%02x”,字节[i]&0xff)
      • 在实用程序库中使用完整的“字节数组到十六进制转换”方法(周围有负载)
        • 这就是问题所在:

          hexString.append(Integer.toHexString(0xFF & bytes[i]));
          
          这将丢失任何前导0-换句话说,任何小于16的字节将显示为一个十六进制数字,而不是两个

          有很多方法可以解决这个问题。例如:

          • 如果值介于0和15之间,则手动追加
            0
            (单击)
          • 使用
            String.format(“%02x”,字节[i]&0xff)
          • 在实用程序库中使用完整的“字节数组到十六进制转换”方法(周围有负载)
            • 这就是问题所在:

              hexString.append(Integer.toHexString(0xFF & bytes[i]));
              
              这将丢失任何前导0-换句话说,任何小于16的字节将显示为一个十六进制数字,而不是两个

              有很多方法可以解决这个问题。例如:

              • 如果值介于0和15之间,则手动追加
                0
                (单击)
              • 使用
                String.format(“%02x”,字节[i]&0xff)
              • 在实用程序库中使用完整的“字节数组到十六进制转换”方法(周围有负载)

              请不要使用StringBuffer的副本,除非您必须使用,它已在近十年前被StringBuilder替换。请不要使用StringBuffer的副本,除非您必须使用,它已在近十年前被StringBuilder替换。请不要使用StringBuffer的副本,除非您必须使用,它在大约十年前被StringBuilder取代。的副本请不要使用StringBuffer,除非必须使用,它在大约十年前被StringBuffer取代。亲爱的Jon先生。我应该在哪里使用
              字符串.format
              ?请谢谢你的帮助answer@user3110137:您当前使用的是
              Integer.toHexString(…)
              尊敬的Jon先生。我应该在哪里使用
              字符串.format
              ?请谢谢你的帮助answer@user3110137:您当前使用的是
              Integer.toHexString(…)
              尊敬的Jon先生。我应该在哪里使用
              字符串.format
              ?请谢谢你的帮助answer@user3110137:您当前使用的是
              Integer.toHexString(…)
              尊敬的Jon先生。我应该在哪里使用
              字符串.format
              ?请谢谢你的帮助answer@user3110137:当前正在使用的
              Integer.tohextstring(…)