При рассмотрении различных вариантов переопределения hashCode ()
я был направлен на Objects.hashCode (Object [])
в guava-библиотеках Google ( javadoc ). В javadoc указано, что он делегирует Arrays.hashCode (Object [])
. Безопасно ли использовать этот метод во многих различных объектах типы? t это подвержено конфликту хешей, или это маловероятно просто потому, что контейнеры обычно содержат только один тип объекта?
В качестве простого примера рассмотрим следующие классы,
public class Student {
private final String name;
public Student(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(name);
}
}
public class Teacher {
private final String name;
public Teacher(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(name);
}
}
public class HashCodeDriver {
public static void main(String[] args) {
final String name = "moe";
Student s = new Student(name);
Teacher t = new Teacher(name);
long studentHash = s.hashCode();
long teacherHash = t.hashCode();
System.out.println("studentHash=" + studentHash + " teacherHash=" + teacherHash);
if(studentHash == teacherHash) {
System.out.println("hash codes match");
}
else {
System.out.println("hash codes don't match");
}
}
}
Вывод:
studentHash=108322 teacherHash=108322
hash codes match
Объекты бывают двух разных типов но генерируют один и тот же хэш-код. Разве это не проблема? Должен ли я передать класс в качестве первого параметра, чтобы предотвратить это столкновение? Например,
public class Student {
private final String name;
public Student(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(Student.class, name);
}
}
public class Teacher {
private final String name;
public Teacher(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(Teacher.class, name);
}
}
Не поэтому ли документ javadoc предупреждает о передаче этому методу только одного объекта? Из javadoc,
Предупреждение: когда предоставляется один объект, возвращаемый хэш-код не совпадает с хэш-кодом этого объекта.