我有两个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;
}
答案 0 :(得分:5)
您使用过==
,但对于像String
这样的对象,它会比较对象引用以查看它们是否引用同一个对象。
要比较String
值,请改用String#equals
。
答案 1 :(得分: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琐事和语言滥用。