SHA哈希在Java中的行为异常-提供的代码

SHA哈希在Java中的行为异常-提供的代码,java,hash,sha256,Java,Hash,Sha256,读取一个文件,然后使用SHA-256对其进行散列,我发现了一个显示两种不同方法的文件 将我散列的文件(PDF)与这两种方法进行比较时,它们不匹配。我正确地遵循代码,不理解为什么它不匹配 以下是我的结果: Hex format: b050692edb134da209adf76347f6c5e49db8734edeaa44876606ec8e5559ab4e Hex format: b050692edb134da29adf76347f6c5e49db8734edeaa4487666ec8e5559a

读取一个文件,然后使用SHA-256对其进行散列,我发现了一个显示两种不同方法的文件

将我散列的文件(PDF)与这两种方法进行比较时,它们不匹配。我正确地遵循代码,不理解为什么它不匹配

以下是我的结果:

Hex format: b050692edb134da209adf76347f6c5e49db8734edeaa44876606ec8e5559ab4e Hex format: b050692edb134da29adf76347f6c5e49db8734edeaa4487666ec8e5559ab4e 十六进制格式:B050692EDB134DA209ADF76347F6C5E49DB8734EDEA44876606EC8E559AB4E 十六进制格式:B050692EDB134DA29ADF76347F6C5E49DB8734EDEA4487666EC8E559AB4E 看起来它在中间掉了两个零点,我就是不明白为什么

Java代码
import java.io.FileInputStream;
导入java.security.MessageDigest;
公共级沙哈什{
公共静态void main(字符串[]args)引发异常{
MessageDigest md=MessageDigest.getInstance(“SHA-256”);
FileInputStream fis=新的FileInputStream(“myfile”);
字节[]数据字节=新字节[1024];
int nread=0;
而((nread=fis.read(数据字节))!=-1){
md.update(数据字节,0,nread);
};
byte[]mdbytes=md.digest();
StringBuffer sb1=新的StringBuffer();
对于(int i=0;i
而不是您应该使用的方法(这些方法不同步,并且您没有使用多个线程,这就像
向量
数组列表
之间的区别一样)。此外,还需要保留前导
0
(s)。您可以使用以下内容更正第二个循环。把这些放在一起

StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < mdbytes.length; i++) {
    sb2.append(String.format("%02x", 0xFF & mdbytes[i]));
}
System.out.println("Hex format: " + sb2.toString());
StringBuilder sb2=新的StringBuilder();
对于(int i=0;i
两者之间的区别在于,第一个添加了
0x100
,然后只接受一个子字符串

这样,第一个循环中的
toString
调用总是返回一个前导
1
后跟实际值的字符串。这样就保留了零


第二个循环产生错误的输出,因为零位丢失。

请不要使用
StringBuffer
,并且您缺少前导
0
(s)的值。这就是我要说的。谢谢你的解释。让我来修改一下,我会接受你的回答。这是成功的,你对十六进制格式的理解是正确的。我想如果我迭代每个十六进制值,答案就会在我面前弹出。@milk你可能还想读和。或者只是使用。我明白了,这很有道理。我不完全明白他为什么那样做。你的解释确实澄清了这一点。非常感谢。我按照@ElliotFrisch的建议使用字符串格式化程序。我想作为一个被解析的整数,我不知道为什么我希望前导零保持不变。