MessageDigest SHA1结果和原始哈希值的Java字节数组比较?

MessageDigest SHA1结果和原始哈希值的Java字节数组比较?,java,arrays,compare,message-digest,Java,Arrays,Compare,Message Digest,我想比较两个字节数组。一个是使用MessageDigestSHA1从明文计算的,另一个是字节数组中的十六进制本身,不进行计算 MessageDigest返回20字节长的结果,String.getBytes()返回40字节长的数组bytesToHex()函数与中提供的相同,仅用于打印 问题: MessageDigest md; try { md = MessageDigest.getInstance("SHA-1"); byte[] toEncode

我想比较两个字节数组。一个是使用
MessageDigest
SHA1从明文计算的,另一个是字节数组中的十六进制本身,不进行计算

MessageDigest
返回20字节长的结果,
String.getBytes()
返回40字节长的数组
bytesToHex()
函数与中提供的相同,仅用于打印

问题:

 MessageDigest md;

    try {
        md = MessageDigest.getInstance("SHA-1");

        byte[] toEncode = "test".getBytes();
        byte[] encoded = md.digest(toEncode);

        System.out.println("String to encode:\t\t" + new String(toEncode));
        System.out.println("Encoded in hex:\t\t\t" + bytesToHex(encoded));
        System.out.println("Encoded length:\t\t\t" + encoded.length);


        byte[] hash = new String("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3").getBytes(); // "test" representation in SHA1

        System.out.println("\nHash to compare with:\t\t" + new String(hash));
        System.out.println("Hash length:\t\t\t" + hash.length);
        System.out.println("Two byte array equals:\t\t" + Arrays.equals(hash, encoded));
        System.out.println("Two equals in string:\t\t" + new String(hash).equals(bytesToHex(encoded).toLowerCase()));

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
String to encode:           test
Encoded in hex:             A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
Encoded length:             20

Hash to compare with:       a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Hash length:                40
Two byte array equals:      false
Two equals in string:       true
如何将字符串转换为字节数组(然后与使用
MessageDigest
计算的字符串进行比较),而不增加额外的开销?与
bytesToHex()
.toUppercase()
进行字符串比较是可行的,但不是一个选项,因为速度在应用程序中至关重要

代码:

 MessageDigest md;

    try {
        md = MessageDigest.getInstance("SHA-1");

        byte[] toEncode = "test".getBytes();
        byte[] encoded = md.digest(toEncode);

        System.out.println("String to encode:\t\t" + new String(toEncode));
        System.out.println("Encoded in hex:\t\t\t" + bytesToHex(encoded));
        System.out.println("Encoded length:\t\t\t" + encoded.length);


        byte[] hash = new String("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3").getBytes(); // "test" representation in SHA1

        System.out.println("\nHash to compare with:\t\t" + new String(hash));
        System.out.println("Hash length:\t\t\t" + hash.length);
        System.out.println("Two byte array equals:\t\t" + Arrays.equals(hash, encoded));
        System.out.println("Two equals in string:\t\t" + new String(hash).equals(bytesToHex(encoded).toLowerCase()));

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
String to encode:           test
Encoded in hex:             A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
Encoded length:             20

Hash to compare with:       a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Hash length:                40
Two byte array equals:      false
Two equals in string:       true
结果:

 MessageDigest md;

    try {
        md = MessageDigest.getInstance("SHA-1");

        byte[] toEncode = "test".getBytes();
        byte[] encoded = md.digest(toEncode);

        System.out.println("String to encode:\t\t" + new String(toEncode));
        System.out.println("Encoded in hex:\t\t\t" + bytesToHex(encoded));
        System.out.println("Encoded length:\t\t\t" + encoded.length);


        byte[] hash = new String("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3").getBytes(); // "test" representation in SHA1

        System.out.println("\nHash to compare with:\t\t" + new String(hash));
        System.out.println("Hash length:\t\t\t" + hash.length);
        System.out.println("Two byte array equals:\t\t" + Arrays.equals(hash, encoded));
        System.out.println("Two equals in string:\t\t" + new String(hash).equals(bytesToHex(encoded).toLowerCase()));

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
String to encode:           test
Encoded in hex:             A94A8FE5CCB19BA61C4C0873D391E987982FBBD3
Encoded length:             20

Hash to compare with:       a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
Hash length:                40
Two byte array equals:      false
Two equals in string:       true

您没有将十六进制表示解码为字节。例如,如果使用来自的解决方案,则两个阵列将匹配:

try {
    byte[] encoded = MessageDigest.getInstance("SHA-1").digest("test".getBytes());
    byte[] hash = DatatypeConverter.parseHexBinary("a94a8fe5ccb19ba61c4c0873d391e987982fbbd3");

    System.out.println("Two byte array equals:\t\t" + Arrays.equals(hash, encoded));
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}