Следующий код может быть найден в классе NHibernate.Id.GuidCombGenerator. Алгоритм создает последовательные (гребенчатые) наборы, основанные на объединении «случайного» guid с DateTime. У меня есть несколько вопросов, связанных с линиями, которые я помеченных * 1) и * 2) ниже:Несколько вопросов о GuidCombGenerator NHibernate
private Guid GenerateComb()
{
byte[] guidArray = Guid.NewGuid().ToByteArray();
// *1)
DateTime baseDate = new DateTime(1900, 1, 1);
DateTime now = DateTime.Now;
// Get the days and milliseconds which will be used to build the byte string
TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
TimeSpan msecs = now.TimeOfDay;
// *2)
// Convert to a byte array
// Note that SQL Server is accurate to 1/300th of a millisecond so we divide by 3.333333
byte[] daysArray = BitConverter.GetBytes(days.Days);
byte[] msecsArray = BitConverter.GetBytes((long) (msecs.TotalMilliseconds/3.333333));
// Reverse the bytes to match SQL Servers ordering
Array.Reverse(daysArray);
Array.Reverse(msecsArray);
// Copy the bytes into the guid
Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);
return new Guid(guidArray);
}
Прежде всего, для * 1), не было бы лучше иметь более недавняя дата как baseDate, например 2000-01-01, чтобы освободить место для большего количества ценностей в будущем?
Относительно вопроса * 2), почему мы заботимся о точности DateTimes в SQL Server, когда нас интересуют только байты datetime и никогда не намерены хранить это значение в поле даты и времени SQL Server? Не было бы лучше использовать всю точность, доступную в DateTime.Now?
Мне интересно, почему он использует DateTime.Now вместо DateTime.UtcNow? Если вы создаете контуры на серверах в разных часовых поясах, смещение будет отличаться, а подсказки не будут последовательными. – MartinF