Хэш-код int

Что такое хэш-код примитивного типа, например int?

например, предположим, что число было целым числом.

int hasCode = 0;

if (num != 0) {
  hasCode = hasCode + num.hashCode();
}

person Ed Lee    schedule 09.08.2012    source источник
comment
Вы не можете вызывать методы для примитивов. Хотя его можно автобоксировать, и тогда как Integer (или аналогичный) получится Integer.hashCode.   -  person Tom Hawtin - tackline    schedule 09.08.2012
comment
В этом случае мы могли бы быть более полезными и добавить хэш-коды для классов-оболочек.   -  person Dennis Meng    schedule 09.08.2012
comment
Хэш-код целого числа — это само целое число.   -  person Chris Dargis    schedule 09.08.2012
comment
@DennisMeng Можете ли вы не читать документы API?   -  person Tom Hawtin - tackline    schedule 09.08.2012
comment
Я мог бы, но смысл моего комментария заключался в том, что мы не должны закрывать ОП только из-за незначительной технической особенности. Суть моего комментария заключалась в том, что нам, вероятно, следует давать ответы, более близкие к сути проблемы.   -  person Dennis Meng    schedule 09.08.2012


Ответы (4)


Для hashCode из int наиболее естественным выбором является использование самого int. Лучше задать вопрос, что использовать для hashCode в long, поскольку он не вписывается в хэш-код размером int. Лучшим источником для этого и всех связанных с hashCode вопросов будет Effective Java.

person Marko Topolnik    schedule 09.08.2012
comment
Меня заинтересовал хэш-код long, и я посмотрел его, это: (int)(value ^ (value >>> 32)); - person Konrad Reiche; 09.08.2012
comment
@platzhirsch Да, именно так это реализовано в java.lang.Long, и это то, что рекомендует Effective Java. - person Marko Topolnik; 09.08.2012
comment
@MarkoTopolnik на самом деле я думаю, что это, вероятно, намного полезнее. - person obataku; 09.08.2012
comment
@veer Вы имеете в виду просмотр кода JDK? Там не будет упоминания о хэш-коде примитивного типа. Возможно, вы имеете в виду проверку hashCode примитивных оболочек --- в этом случае я бы рекомендовал grepcode над громоздкой загрузкой. - person Marko Topolnik; 09.08.2012
comment
@MarkoTopolnik, почему не в реализации Java API упоминается, как работает Java API... grepcode просто содержит загруженный выпуск OpenJDK, так что на самом деле вы защищаете именно то, что я только что сделал. Помимо всего этого, проверка спецификации для Integer.hashCode и Long.hashCode< /a> на самом деле лучший выбор для изучения этого. Все реализации должны соответствовать спецификации. - person obataku; 10.08.2012
comment
@MarkoTopolnik неважно, я думаю, что ответил до того, как прочитал ваше редактирование: p - person obataku; 10.08.2012

Взято из исходного кода Integer.class:

/**
 * Returns a hash code for this {@code Integer}.
 *
 * @return  a hash code value for this object, equal to the
 *          primitive {@code int} value represented by this
 *          {@code Integer} object.
 */
public int hashCode() {
    return value;
}

Где value — значение целого числа.

person Konrad Reiche    schedule 09.08.2012
comment
Примечание. Это правильно, но вопрос предназначался для примитивного int, а не для объекта Integer, содержащего значение «integer». - person MANU; 05.06.2017

Нет доступного метода hashCode() для примитивного типа int.

Integer — тип класса Wrapper, а hashcode() возвращает int

person kosa    schedule 09.08.2012

Метод java.lang.Integer.hashCode() возвращает значение хеш-кода для примитивного значения int, но представленного как объект Integer.

/**
 * Returns a hash code value for an Integer,
 * equal to the primitive int value it represents.
 */
public class IntegerDemo {

    public static void main(String[] args){
        Integer i = new Integer("20");
        System.out.println("Value = " + i.hashCode());
    }

}`

Результаты:

Значение = 20

Ссылка на источник: http://www.tutorialspoint.com/java/lang/integer_hashcode.htm

person Amogh Mishra    schedule 15.01.2016
comment
промежуточная переменная retval на самом деле не нужна в этом коде, поскольку она используется только один раз. - person James P.; 29.06.2016