1

ここに、手動で指定された同じ入力値の「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=

上記のアルゴリズムは同じハッシュ コードを生成しますが、中間値は同じではありません。何故ですか?

4

2 に答える 2

9

[B@42e816Javaで配列を印刷しようとすると得られるものです。内容ではなく、メモリアドレスを出力するだけです。明らかに、2 つの異なるアレイは異なるアドレスを持ちます。

于 2012-06-02T11:00:57.940 に答える
5

次の 2 行は意味がありません。

System.out.println(result);
System.out.println(result1);

当然のことながら、2 バイト配列の内容は出力されません。代わりに、型 ([Bバイト配列を表す) と、配列のメモリ アドレスと見なすことができる数値を出力します。

バイト配列の内容を出力するには、Base 64 エンコーディングを使用して、結果の文字列を出力します。私は彼らが同じになると確信しています。

于 2012-06-02T11:01:05.423 に答える