我有一个需要为表格键入的自定义对象的问题。我需要生成一个唯一的数字键。我遇到了碰撞问题,我想知道是否可以利用字典来帮助我。假设我有一个这样的对象:
class Thingy
{
public string Foo;
public string Bar;
public string Others;
}
等等更多的领域。假设 Foo 和 Bar 是我的关键字段 - 如果它们在两个 Thingys 之间相等,那么这两个对象应该被认为是相等的(一个可能代表另一个对象的更新,而 Others 字段正在更新。)所以我有这些:
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
}
所以这在大多数情况下都有效,但在极少数情况下,实际上不同的两个 Thingy 具有相同的哈希码。
我的问题是:我可以使用 Dictionary <Thingy, int
> 放入我的 Thingys 的位置,并使用从字典中出来的顺序值作为我的实际键吗?我想知道字典在检测到罕见的哈希码冲突时是否会调用我的 Equals 方法,确定对象实际上是不同的,并以不同的方式存储它们。然后我在查找它时进行成像,它会看到一个用于该哈希的存储桶并搜索正确的东西,再次使用 Equals 进行比较。
字典是这种情况,还是仅解决哈希码不同但(哈希%大小)相同的冲突?如果这行不通,有什么可能?