11 October 2008
Невеличкий Code Smell – зменшення унікальності
Сьогодні (і так в суботу), в реалізації кешу нашого додатку знайшов такий приклад коду.
string hashKey = string.Format("{0}_{1}",
String.IsNullOrEmpty(customerId) ? string.Empty : customerId.GetHashCode().ToString(),
String.IsNullOrEmpty(orderId) ? string.Empty : orderId.GetHashCode().ToString());
Обидва ідентифікатори це GUID в форматі рядка.
А ось невеличкий код який перевірить такий підхід.
IDictionary cache = new Dictionary();
for (int i = 0; i
{
Guid newId = Guid.NewGuid();
int hashCode = newId.ToString().GetHashCode();
if (cache.ContainsKey(hashCode))
{
Console.WriteLine("HashCode: {0}; First GUID: {1}; Second GUID: {2}",
hashCode, cache[hashCode], newId);
}
else
{
cache.Add(hashCode, newId);
}
}
і перші три результати цього кода
HashCode: 140496230; First GUID: d45781e0-62e6-4793-94e706cb3d2ca14a; Second GUID: ffd2b182-a93d-49d5-853e-ca56e5de6fd0
HashCode: 1297286347; First GUID: 53d0efc3-393d-4699-89e5fb10e3bf1220; Second GUID: 09bfe993-104c-48d6-9ce2-ab76a9483e89
HashCode: -1224017075; First GUID: 92ecbaf5-73e5-4f6f-bc4991f0c29b0bf0; SecondGUID: 8c36cfc8-f655-43fa-a2ed-a8584614888b
Цікаво коли ця помилка виявиться на продакшені?
Вчу українську, багато працюю. Цікавлюсь моделюванням небезпек. Більшість часу витрачаю на .Net.