Я определяю мой класс, как:Равномерное распределение хэш-код()
final class Key<T extends Comparable<T>> {
private final T q;
private final T o;
public Key(T q1, T o1) {
q = q1;
o = o1;
}
@Override
public boolean equals(Object obj) {
if(obj != null && obj instanceof Key) {
Key<T> s = (Key<T>)obj;
return q.equals(s.q) && o.equals(s.o);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(q,o);
}
}
Я также определить массив содержать ключ объекта. Например:
Object arr[] = new Object[100];
Key<String> k = new Key<>("a","b");
int h = k.hashcode();
...
arr[h+i % h] = k; //i from 1 to 10 for example
Проблема заключается в том, что хэш-код() может возвращать отрицательное значение, так
arr[h+i % h] = k;
может вернуть ошибку из индекса массива. Вот почему я изменил код, как (на основе моего поиска для избежания хэш-код() возвращают отрицательное значение):
@Override
public int hashCode() {
return (Objects.hash(q,o)&0x7FFFFFFF);
}
Так что, если я делаю это так, делает равномерное распределение хэш-код() быть изменено или нет? Я имею в виду, что вероятность иметь одно и то же значение от двух разных объектов будет увеличена или нет?
Как вы можете создать объект ключа в качестве ключа. Он должен давать ошибку компилятора как неправильное количество аргументов для типа Key –
Roshan
Да, моя ошибка. Я также отредактировал его. Спасибо – nd07
, вы можете взглянуть на хеш-шепот, который имеет очень хорошее распространение. и, возможно, не имеет значения для новичков –