Arrays.deepHashCode() не является уникальным
Почему Arrays.deepHashCode()
не уникальный? Что я могу сделать, чтобы сгенерировать уникальный хэш массива?
int[][] array1 = { { 8, 7, 4 }, { 3, 6, 5 }, { 0, 2, 1 } };
int[][] array2 = { { 8, 4, 0 }, { 6, 7, 5 }, { 3, 2, 1 } };
System.out.println("Hash array1 " + Arrays.deepHashCode(array1));
System.out.println("Hash array2 " + Arrays.deepHashCode(array2));
?!
Hash array1 37308160
Hash array2 37308160
2 ответа
java.util.Arrays.deepHashCode(Object[])
Метод возвращает хеш-код на основе "глубокого содержимого" указанного массива. Для любых двух массивов a и b, таких, что Arrays.deepEquals(a, b)
, это также тот случай, когда Arrays.deepHashCode(a) == Arrays.deepHashCode(b)
,
Согласно Javadoc:
public static int deepHashCode(Object[] a)
Возвращает хэш-код, основанный на "глубоком содержимом" указанного массива. Если массив содержит в качестве элементов другие массивы, хеш-код основан на их содержимом и т. Д. До бесконечности. Поэтому недопустимо вызывать этот метод в массиве, который содержит себя в качестве элемента, прямо или косвенно через один или несколько уровней массивов. Поведение такого вызова не определено. Для любых двух массивов a и b таких, что
Arrays.deepEquals(a, b)
, это также тот случай, когдаArrays.deepHashCode(a) == Arrays.deepHashCode(b)
,
Это не нарушает контракт Java. Хэш-код должен возвращать разные целочисленные значения для разных объектов как можно чаще, однако это не требуется.
Генеральный договор hashCode:
Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в сравнениях сравнения для объекта, не изменяется. Это целое число не должно оставаться согласованным от одного выполнения приложения к другому выполнению того же приложения.
- Если два объекта равны в соответствии с методом equals(Object), то вызов метода hashCode для каждого из двух объектов должен привести к одному и тому же целочисленному результату.
- Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals(java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен приводить к разным целочисленным результатам. Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может улучшить производительность хеш-таблиц.