2

我有两个相同的 md5 哈希密码,应该使用 MessageDigest.isEqual 方法返回 true。但是,比较返回 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;
    }
4

2 回答 2

5

您已经使用==了 ,但是对于像String它这样的对象,它会比较对象引用以查看它们是否引用同一个对象。

要比较String值,请String#equals改用。

于 2013-05-08T23:41:49.517 回答
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 琐事和语言滥用,而不是我建议您实际做的事情。

于 2013-05-09T01:01:09.003 回答