2013-04-18 4 views
2

В SO Я прочитал несколько ответов, связанных с реализацией hashcode и предложением использовать оператор XOR. (Например, Why are XOR often used in java hashCode() but another bitwise operators are used rarely?).Hashcode generated by Eclipse

Когда я использую Eclipse, чтобы создать функцию Hashcode где field является объектом и timestamp длинными, выход:

public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
     + field == null) ? 0 : field.hashCode()); 
    return result; 
} 

Есть ли какая-либо причина, не используя оператор XOR, как показано ниже?

result = prime * result + (int) (timestamp^(timestamp >>> 32)); 
+3

Я вижу XOR здесь 'prime * result + (int) (timestamp^(timestamp >>> 32))' ... –

+0

@Heuster это его недостаток EDIT. На самом деле Eclipse создает только эту строку 'result = prime * result + field == null)? 0: field.hashCode()); ' – Jayamohan

ответ

3

Eclipse берет безопасный выход. Хотя метод расчета, который использует штрих, умножение и добавление медленнее, чем один XOR, он дает вам общий хэш-код в ситуациях, когда у вас есть несколько полей.

Рассмотрим простой пример - класс с двумя String s, a и b. Вы можете использовать

a.hashCode()^b.hashCode() 

или

a.hashCode() * 31 + b.hashCode() 

Теперь рассмотрим два объекта:

a = "ABC"; b = "XYZ" 

и

a = "XYZ"; b = "ABC" 

Первый метод будет производить одинаковые хэш-коды для них, потому что XOR симметричен; второй метод будет генерировать разные хэш-коды, что хорошо, потому что объекты не равны. В общем, вы хотите, чтобы не равные объекты имели разные хэш-коды как можно чаще, чтобы повысить производительность контейнеров на основе хэша этих объектов. Метод 31*a+b достигает этой цели лучше, чем XOR.

Обратите внимание, что, когда вы имеете дело с частями одного и того же объекта, как в

timestamp^(timestamp >>> 32) 

выше аргумента гораздо слабее, встречая двумя отметками таким образом, что единственное различие между ними состоит в том, что их верхние и нижние части поменять местами сложнее представить, чем два объекта с измененными значениями полей a и b.

Смежные вопросы