Лучший способ определить метод хеш-кода для массива char
Лучший способ определить метод хеш-кода для массива char. Есть ли лучший способ реализовать наш собственный метод hascode() для минимальной коллизии?
char arr1[]={'a','b','c'};
char arr2[]={'b','a','c'};
char arr3[]={'c','a','b'};
int hashcode() {
int p=31;
int n=arr1.length;
int hash=1;
for(int i=0;i<n;i++) {
hash=31*hash+(int)arr1[i];
}
return hash;
}
2 ответа
Это очень сильно зависит от того, как ваши данные обычно отличаются друг от друга.
Вы можете написать эту функцию хеш-кода:
return arr.Length;
И это может идеально подойти, если большинство ваших массивов имеют разный размер.
Или вы можете использовать первые два элемента, если ваш массив обычно имеет совершенно другое содержимое.
Примечание: не имеет смысла зацикливать весь массив и делать что-то более сложное, чем сравнение со значением другого массива. Зачем? Потому что хеш-код используется только для оптимизации производительности. Так что это должно быть намного быстрее, чем Equals
, А также Equals
сравнивает все значения.
Когда массивы отличаются по размеру, Equals
не зацикливался Вместо этого он возвращается сразу после сравнения Length
, Попробуйте побить это в функции хэш-кода.
Если у вас есть объект, который содержит массив символов, и вы хотите переопределить hashCode(), тогда вы можете использовать метод для него:
java.util.Arrays.hashCode()
Если вы не хотите использовать этот метод, вы можете проверить, по крайней мере, что делает:
if (var0 == null) {
return 0;
} else {
int var1 = 1;
long[] var2 = var0;
int var3 = var0.length;
for(int var4 = 0; var4 < var3; ++var4) {
long var5 = var2[var4];
int var7 = (int)(var5 ^ var5 >>> 32);
var1 = 31 * var1 + var7;
}
return var1;
}