библиотеки guava: Безопасна ли коллизия Objects.hashCode (Object [])?

При рассмотрении различных вариантов переопределения 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,

Предупреждение: когда предоставляется один объект, возвращаемый хэш-код не совпадает с хэш-кодом этого объекта.

7
задан Hamal000 5 September 2012 в 19:51
поделиться