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