Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么SHA-1算法为相同的输入值生成不同的值?_Java_Sha_Sha1 - Fatal编程技术网

Java 为什么SHA-1算法为相同的输入值生成不同的值?

Java 为什么SHA-1算法为相同的输入值生成不同的值?,java,sha,sha1,Java,Sha,Sha1,在这里,我附上了与手动给定的相同输入值的基于“SHA-1”算法的Java代码: import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Encoder; public class NewClass { public static void main(String args[]) throws NoSuchAlg

在这里,我附上了与手动给定的相同输入值的基于“SHA-1”算法的Java代码:

import java.security.MessageDigest;    
import java.security.NoSuchAlgorithmException;    
import sun.misc.BASE64Encoder;

public class NewClass {       
 public static void main(String args[]) throws NoSuchAlgorithmException        
 {       
    MessageDigest digest = MessageDigest.getInstance("SHA-1");    
    System.out.println("Algorithm :"+digest.getAlgorithm());    
    digest.update("welcome".getBytes());    
    byte[] result = digest.digest();     
    hash = (new BASE64Encoder()).encode(result);     
    MessageDigest digest1 = MessageDigest.getInstance("SHA-1");    
    digest1.update("welcome".getBytes());    
    byte[] result1 = digest1.digest();    
    System.out.println(result);    
    System.out.println(result1);    
    String hash1 = (new BASE64Encoder()).encode(result);    
    System.out.println("Digest value"+hash);    
    System.out.println("Digest value"+hash1);       
 }

}
输出:

Algorithm :SHA-1

[B@42e816

[B@9304b1

Digest value wLE3/i15JFnyb/djzORFdKW1qwM=

Digest value wLE3/i15JFnyb/djzORFdKW1qwM=

上述算法生成相同的哈希代码,但中间值不同。为什么会这样?

[B@42e816
是您尝试在Java中打印数组时得到的结果。它只打印其内存地址,而不是内容。显然,两个不同的数组将具有不同的地址。

[B@42e816
是您尝试用Java打印数组时得到的结果。它只打印其内存地址,而不是内容。显然,两个不同的数组将具有不同的地址。

这两行没有意义:

System.out.println(result);
System.out.println(result1);
不会像您预期的那样打印两字节数组的内容。相反,打印类型(
[B
代表字节数组)和一个可以被认为是数组内存地址的数字


要打印字节数组的内容,请使用Base 64编码并打印结果字符串。我相信它们是相同的。

这两行没有意义:

System.out.println(result);
System.out.println(result1);
不会像您预期的那样打印两字节数组的内容。相反,打印类型(
[B
代表字节数组)和一个可以被认为是数组内存地址的数字


要打印字节数组的内容,请使用Base64编码并打印结果字符串。我相信它们将是相同的。

我没有回答您的问题,但我认为您错过了take
string hash1=(新BASE64Encoder())。encode(结果);
,它应该是result1。我没有回答你的问题,但我想你错过了take
String hash1=(新的BASE64Encoder())。encode(result);
,它应该是result1。