Tengo un problema con un objeto personalizado que debe estar codificado para una tabla. Necesito generar una clave numérica única. Tengo problemas de colisión y me pregunto si puedo aprovechar un diccionario para ayudarme. Supongamos que tengo un objeto como este:¿Qué tan bien resuelve el diccionario .NET las colisiones?
class Thingy
{
public string Foo;
public string Bar;
public string Others;
}
y así sucesivamente con más campos. Digamos que Foo y Bar son mis campos clave: si son iguales entre dos Thingys, entonces los dos objetos se deben considerar iguales (uno puede representar una actualización para el otro, con los campos Otros actualizados). Tengo estos:
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
}
por lo que esto funciona en su mayor parte, pero hay raras ocasiones en que dos Thingys que son realmente diferentes tienen el mismo código hash.
Mi pregunta es esta: ¿podría usar un Diccionario <Thingy, int
> donde puse mi Thingys, y usar un valor secuencial que sale del diccionario como mi clave real? Me pregunto si el diccionario, al detectar una rara colisión de código hash, llamará a mi método Equals, determinará que los objetos son realmente diferentes y los almacenará de manera diferente. Imaginé luego, al buscarlo, vería un cubo para ese hash y buscaría el Thingy correcto, nuevamente usando Equals para comparar.
¿Es este el caso del diccionario, o solo resuelve colisiones donde el código hash es diferente, pero (hash% size) es el mismo? Si esto no funciona, ¿qué podría ser?
Una buena manera de ilustrar el punto. – itowlson