Лучший способ определить метод хеш-кода для массива 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;
}
Другие вопросы по тегам