キーが 10 進数である大きな辞書がありますが、System.Decimal の GetHashCode() はひどく悪いです。私の推測を証明するために、100.000 個の隣接小数を使用して for ループを実行し、分布を確認しました。100.000 の異なる 10 進数は、2 つ (2 つ!!!) の異なるハッシュコードのみを使用しました。
10 進数は 16 バイトで表されます。ギドそっくり!しかし、Guid の GetHashCode() ディストリビューションはかなり優れています。できるだけ安くC#で小数をGuidに変換するにはどうすればよいですか? アンセーフコードもOK!
編集: テストが要求されたので、コードは次のとおりです。
decimal d = 96000000000000000000m;
Dictionary<int, int> hashcount = new Dictionary<int, int>();
int length = 100000;
for (int i = 0; i < length; i++)
{
int hashcode = d.GetHashCode();
int n;
if (hashcount.TryGetValue(hashcode, out n))
{
hashcount[hashcode] = n + 1;
}
else
{
hashcount.Add(hashcode, 1);
}
d++;
}
Console.WriteLine(hashcount.Count);
これは 7 を出力します。2 になった最初の 10 進数を覚えていません。