Это плохая идея использовать recordId в качестве хэш-кода? - PullRequest
2 голосов
/ 20 января 2010

Предположим, у меня есть простой объект DTO прямо из базы данных, а идентификатор - это recordId, который определенно уникален, тогда будет ли хорошей идеей сделать следующее?

public class DTO
{
    public int Id { get; set; }

    public override bool Equals(object obj)
    {
        return (Id == ((DTO)obj).Id);
    }

    public override int GetHashCode()
    {
        return Id;
    }
}

Причина, по которой я немного сомневаюсь, в том, что я не вижу этого в коде вокруг меня, в отличие от кода, подобного

int hash = 7;
hash = 89 * hash + pageId.hashCode();
hash = 89 * hash + recordId;
return hash;

Ответы [ 4 ]

5 голосов
/ 20 января 2010

Контракт для хеш-кода: «два равных объекта должны иметь одинаковый хеш-код». Это подразумевает, что любые поля, используемые при определении равенства, должны быть представлены в битах, которые составляют хеш-код. Поскольку ваш контракт на равенство относится только к ID, то это единственное, что требуется в хэш-коде.

2 голосов
/ 20 января 2010

Предполагается, что хорошая хеш-функция (более или менее) случайным образом распределяет хеш-значения, поэтому, когда вы помещаете хеш-значения в двоичное дерево, вы получаете хорошее, равномерно распределенное дерево, а не такое, которое связанный список вниз на одну сторону.

Смотрите здесь: http://blogs.oracle.com/kah/entry/the_importance_of_good_hash

Но если у вас никогда не будет такой необходимости (т.е. вы всегда будете возвращать записи из базы данных, а не искать их из своего двоичного дерева), то использование идентификатора в качестве хэша кажется мне совершенно разумным.

1 голос
/ 20 января 2010

Если ваш класс содержит только целое число, вы можете использовать его в качестве хеш-кода. Это то же самое, что и реализация метода Int32.GetHashCode, который просто возвращает само целое число.

1 голос
/ 20 января 2010

Поскольку у int уже есть метод для получения хеш-кода, я бы просто использовал его.

public override int GetHashCode()
{
    return Id.GetHashCode();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...