私が解決しようとしているもの: Dictionary(string, someObject) のキーとしてguid文字列を使用し、キーの完全なハッシュが必要です...
何か不足しているかどうかわかりません...サイズ割り当てのみを渡す辞書コンストラクターで次のテストを実行すると、実行ごとに+-10の衝突が発生します。文字列に対して gethashcode を呼び出すだけで IEqualityComparer を渡すと、テストに合格しました。場合によっては x = 10 回の反復を使用して複数回実行し、y を最大 100 万回実行します。特に文字列を扱うときに、辞書がハッシュ関数を調整していると思いましたか?私のマシンにはリフレクターがありません:(だから今夜はチェックできません...辞書の初期化を交互にコメントアウトすると、私の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();
}
}