Чтобы ответить на другую часть вашего вопроса: чтобы уменьшить вероятность коллизий, вы должны реализовать алгоритм хеширования, который обеспечивает равномерное распределение хеш-кодов по набору возможных входных данных.
Например, предположим, что вы реализовали наивный hashCode()
метод для хеширования MyString
экземпляров:
public class MyString {
private final char[] arr;
// Constructor and other methods.
public int hashCode() {
return arr.length == 0 ? 0 : (int) arr[0];
}
}
В этом примере для создания хеш-кода используется только первый символ 1009 *. Поэтому, если бы вы хэшировали строки: «яблоко», «анаконда», «анекдот», они бы выдали одинаковое хеш-значение. Более эффективный хеш-код будет проверять все буквы в массиве символов, чтобы определить значение хеш-кода, что, мы надеемся, уменьшит вероятность коллизии.