У меня возникла проблема с настраиваемым объектом, который должен быть привязан к таблице. Мне нужно создать уникальный цифровой ключ. У меня проблемы с столкновением, и мне интересно, могу ли я использовать словарь, чтобы помочь мне. Предположим, у меня есть такой объект:
class Thingy
{
public string Foo;
public string Bar;
public string Others;
}
и т.д. с большим количеством полей. Допустим, что Foo и Bar являются моими ключевыми полями - если они равны между двумя Thingys, то два объекта должны считаться равными (один может представлять собой обновление для другого, при этом обновляются поля Other). Поэтому у меня есть следующие:
public override bool Equals(object obj)
{
Thingy thing = (Thingy)obj; // yes I do type check first
return (this.Foo == thing.Foo && this.Bar == thing.Bar);
}
public override int GetHashCode()
{
return (this.Foo + this.Bar).GetHashCode(); // using default string impl
}
так что это работает по большей части, но есть редкие случаи, когда два Thingys, которые на самом деле разные, имеют один и тот же хеш-код.
Мой вопрос заключается в следующем: могу ли я использовать словарь <Thingy, int
> , где я помещал в Thingys, и использовать последовательное значение, выходящее из словаря, как мой фактический ключ? Мне интересно, будет ли Словарь при обнаружении редкого столкновения кодов хэшей вызовет мой метод Equals, определит, что объекты на самом деле разные, и сохраните их по-разному. Затем я получаю изображение, когда смотрю на него, он видит ведро для этого хеша и ищет правильную Thingy, снова используя Equals для сравнения.
В этом случае со словарем, или он разрешает только конфликты, в которых хеш-код отличается, но (хэш-размер) одинаковый? Если это не сработает, что может?