У меня есть большой словарь, где ключ десятичный, но GetHashCode () System.Decimal катастрофически плох.Чтобы доказать свою догадку, я запустил цикл for с 100.000 соседних десятичных знаков и проверил распределение.100 000 различных десятичных чисел использовали только 2 (два !!!) различных хеш-кода.
Десятичное число представлено в виде 16 байтов.Так же, как Guid!Но GetHashCode () дистрибутива Guid довольно хорош. Как преобразовать десятичную дробь в Guid в C # как можно дешевле? Небезопасный код в порядке!
РЕДАКТИРОВАТЬ: Испытание было запрошено, поэтому вот код:
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.