2013-05-08 118 views
2

我有兩個相同的md5哈希密碼,並應使用MessageDigest.isEqual方法返回true。但是,比較返回錯誤。比較兩個消解的md5字符串返回false

使用Array.toString打印字節數組時,它們是相同的。它仍然不起作用,無論是Arrays.euqals還是MessageDigest.isEqual。

public boolean verifyUserCredentials(String username, MessageDigest password) { 

     ListIterator<User> iterator = userList.listIterator(); 
     while (iterator.hasNext()) { 
      User user = iterator.next(); 
      byte md1[] = user.getPassword().digest(); 
      byte md2[] = password.digest(); 
      if (user.getUsername() == username && MessageDigest.isEqual(md1, md2)) { 
       return true; 
      } 
     } 
     return false; 
    } 
+0

我不認爲你的問題與比較md5s有任何關係。這是你笨拙的用戶名。 – 2013-05-08 23:55:45

+0

我一直在做這麼多次相同的錯誤。感謝您的意見。 – mgerstner 2013-05-09 06:31:39

回答

5

您已經使用==,但對於像String對象是比較對象引用,看看他們是否指向同一個對象。

要比較String的值,請改爲使用String#equals

0

或者你可以採取一個邪惡的做法和濫用串實習:

user.getUsername().intern() == username.intern() 

下面的代碼打印:

String s1 = "asdf"; 
String s2 = "as"; // break this into two parts to keep the compiler from 
s2 = s2 + "df"; // automatically interning the constant and having the strings 
        // be the same. 

System.out.println(s1 == s2 ? "true" : "false"); 
System.out.println(s1.intern() == s2.intern() ? "true" : "false"); 

輸出:

false 
true 

的+ 「DF」 是需要保持編譯器不會自動插入常量字符串。

注意:這是更多的Java瑣事和語言濫用,而不是我建議你實際做的事情。