У меня есть приложение C#, которое генерирует Sequential GUID для каждой строки, которую я вставляю в таблицу. Я ожидаю, что вставленные GUID будут последовательными, но иногда прерывают последовательность (в кусках).Сгенерированные последовательные GUID иногда не являются последовательными
Пример:
Эти идентификаторы GUID показаны в том порядке, что они вставлены.
Почему эти «последовательные» GUID создаются с таким большим прерыванием последовательности?
Код, используемый для создания последовательного GUIDs:
class NativeMethods
{
[DllImport("rpcrt4.dll", SetLastError = true)]
public static extern int UuidCreateSequential(out Guid guid);
}
public static Guid CreateSequentialGuid()
{
const int RPC_S_OK = 0;
Guid guid;
int result = NativeMethods.UuidCreateSequential(out guid);
if (result == RPC_S_OK)
return guid;
else
return Guid.NewGuid(); //<--In debugging, this statement never runs.
}
кода, используемого в цикле для вставки нового GUIDs и информации в таблицу:
Guid mySequentialGUID = CreateSequentialGuid();
string[] row = { item1,
item2,
item3,
sourceText,
encoding.ToString(),
mySequentialGUID.ToString()
};
var listViewItem = new ListViewItem(row);
myListView.Items.Add(listViewItem);
Edit: Пожалуйста, смотрите на этот вопрос для понимания Последовательные идентификаторы GUID:
- What are the performance improvement of Sequential Guid over standard Guid?
- Advantages and disadvantages of GUID/UUID database keys
GUID существует, чтобы быть уникальным номером. Не больше, не меньше. Хотя для их генерации существуют разные алгоритмы, вы не должны полагаться на конкретные свойства конкретных реализаций. Нарисуйте GUID как GUID, не более того. Если вам нужно увеличивать число, то * получите число и увеличивайте его *, вместо использования GUID, который * только * представляет собой способ генерации * уникальных * чисел. – Servy
Я никогда не слышал о последовательном GUID, но это кажется совершенно неправильным. Вы это сделали? GUID по самой своей природе уникален, и вы не можете контролировать, как он создан. Если вы * знаете, какой следующий GUID будет сгенерирован (потому что он следующий по порядку от вашего последнего), то это не уникально, потому что кто-то другой может сделать то же самое, начиная с того же стартового значения. –
@ rory.ap Я не составлял последовательный GUID. Существует даже встроенный метод для создания последовательных GUID в Transact-SQL под названием NewSequentialID(). https://msdn.microsoft.com/en-us/library/ms189786.aspx –