我要解决的问题:使用 guid 字符串作为 Dictionary(string, someObject) 的键,我希望对键进行完美的散列...
不确定我是否遗漏了一些东西......当我使用字典构造函数运行以下测试时,只传递大小分配我每次运行都会得到 +- 10 次冲突。当我传入 IEqualityComparer 时,只需在字符串上调用 gethashcode,我的测试就顺利通过了!在某些情况下使用 x = 10 次迭代进行多次运行,并且 y 高达一百万!我认为字典正在调整哈希函数,尤其是在处理字符串时?我的机器上没有反射器:(所以我今晚不能检查...如果您注释掉交替的字典初始化,您会看到...测试在我的 i7 上运行相对较快。
[TestMethod]
public void NearPerfectHashingForGuidStrings()
{
int y = 100000;
int collisions = 0;
//Dictionary<string, string> list = new Dictionary<string, string>(y, new GuidStringHashing());
Dictionary<string, string> list = new Dictionary<string, string>(y);
for (int x = 0; x < 5; x++)
{
Enumerable.Range(1, y).ToList().ForEach((h) =>
{
list[Guid.NewGuid().ToString()] = h.ToString();
});
var hashDuplicates = list.Keys.GroupBy(h => h.GetHashCode())
.Where(group => group.Count() > 1)
.Select(group => group.Key).ToList();
hashDuplicates.ToList().ForEach(v => Debug.WriteLine( x + "--- " + v));
collisions += hashDuplicates.Count();
list.Clear();
}
Assert.AreEqual(0, collisions);
}
public class GuidStringHashing : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return GetHashCode(x) == GetHashCode(y);
}
public int GetHashCode(string obj)
{
return obj.GetHashCode();
}
}