2014-09-19 107 views
0

我正在使用Java的MessageDigest來執行散列項目。我想通過隨機生成的字符串創建散列衝突。我已經證實我的琴絃是真正隨機的。當我輸出摘要時,它始終以「[B @」開頭,出於某種原因,當我試圖用8位來檢測碰撞時,顯然一切都以「[」開頭。這裏是我的代碼:Java messageDigest奇怪的輸出

public boolean encrypt(String x) throws Exception { 
    System.out.println("x is " + x); 
    java.security.MessageDigest d = java.security.MessageDigest.getInstance("SHA-1"); 
    d.update(x.getBytes()); 
    d.reset(); 
    String result = d.digest().toString() + "  "; 
    char[] tempCharArray = result.toCharArray(); 
    String bitArray = ""; 
    for(int i=0; i< tempCharArray.length; i++){ 
     bitArray += String.format("%8s", Integer.toBinaryString(tempCharArray[i] & 
      0xff)).replace(' ', '0'); 
    } 

    result = bitArray.substring(0,8); 
    return result; 
} 

有沒有人見過這個/知道怎麼做才能做對吧?謝謝

回答

2

你看起來是在你的代碼中做一些奇怪的東西。

首先,你打電話;

String result = d.digest().toString() 

..這是想給你的string representation of a byte array object,它是由類的名字,一個「@」符號,而散列碼的。 Arrays have a class name of "[B",因此你總會得到一些從「[B @」開始的東西。

其次,您致電d.update(x.getBytes()),然後立即致電d.reset()。即使你解決了第一個問題,你也不會消化任何東西,不管x的值如何,所以你總是會得到相同的結果,the SHA-1 hash of an empty string,即da39a3ee5e6b4b0d3255bfef95601890afd80709