Есть ли способ получить функциональность генератора Sql Server 2005+ Sequential Guid, не вставляя записи для его повторного считывания в оба конца или не вызывая собственный вызов win dll? Я видел, как кто-то ответил с помощью способа использования rpcrt4.dll, но я не уверен, сможет ли это работать из моей размещенной среды для производства.
Редактировать: Работая с ответом @John Boker, я попытался превратить его в генератор GuidComb, вместо того чтобы зависеть от последнего сгенерированного Guid, кроме как начать заново. Что за семя вместо того, чтобы начинать с Guid.Empty, который я использую
public SequentialGuid()
{
var tempGuid = Guid.NewGuid();
var bytes = tempGuid.ToByteArray();
var time = DateTime.Now;
bytes[3] = (byte) time.Year;
bytes[2] = (byte) time.Month;
bytes[1] = (byte) time.Day;
bytes[0] = (byte) time.Hour;
bytes[5] = (byte) time.Minute;
bytes[4] = (byte) time.Second;
CurrentGuid = new Guid(bytes);
}
Я основал это на комментариях к
// 3 - the least significant byte in Guid ByteArray
[for SQL Server ORDER BY clause]
// 10 - the most significant byte in Guid ByteArray
[for SQL Server ORDERY BY clause]
SqlOrderMap = new[] {3, 2, 1, 0, 5, 4, 7, 6, 9, 8, 15, 14, 13, 12, 11, 10};
Похоже ли это на то, как я хотел бы заполнить guid с DateTime, или похоже, что я должен сделать это в обратном порядке и работать в обратном направлении от конца индексов SqlOrderMap? Меня не слишком беспокоит то, что они будут прерываться на пейджинг всякий раз, когда будет создаваться начальный guid, поскольку он будет происходить только во время перезапусков приложений.