Win32 UuidCreateSequential
создает Version 1
uuid .
Вот несколько примеров uuid версии 1, созданных на моем компьютере с использованием UuidCreateSequential
:
{1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1}
{220FB46C-63D1-11E1-80DB-B8AC6FBE26E1}
Первое, что важно отметить, что эти uuid содержат MAC-адрес моей машины (B8AC6FBE26E1
):
Node
======================= ============
1BE8D85D-63D1-11E1-80DB B8AC6FBE26E1
1BE8D85E-63D1-11E1-80DB B8AC6FBE26E1
1BE8D85F-63D1-11E1-80DB B8AC6FBE26E1
1BE8D860-63D1-11E1-80DB B8AC6FBE26E1
1BE8D861-63D1-11E1-80DB B8AC6FBE26E1
1BE8D862-63D1-11E1-80DB B8AC6FBE26E1
1BE8D863-63D1-11E1-80DB B8AC6FBE26E1
1BE8D864-63D1-11E1-80DB B8AC6FBE26E1
1BE8D865-63D1-11E1-80DB B8AC6FBE26E1
220FB46C-63D1-11E1-80DB B8AC6FBE26E1
Так что, если вы надеетесь, что разные компьютеры будут генерировать направляющие, которые «близки» друг к другу, вы будете разочарованы.
Давайте посмотрим на остальные значения.
Семь с половиной байтов из оставшихся 10 байтов являются меткой времени ;количество интервалов в 100 нс с 00: 00: 00 15 октября 1582 .Перестановка этих байтов меток времени вместе:
Timestamp Node
=============== ====== ============
1E163D11BE8D85D 1-80DB B8AC6FBE26E1
1E163D11BE8D85E 1-80DB B8AC6FBE26E1
1E163D11BE8D85F 1-80DB B8AC6FBE26E1
1E163D11BE8D860 1-80DB B8AC6FBE26E1
1E163D11BE8D861 1-80DB B8AC6FBE26E1
1E163D11BE8D862 1-80DB B8AC6FBE26E1
1E163D11BE8D863 1-80DB B8AC6FBE26E1
1E163D11BE8D864 1-80DB B8AC6FBE26E1
1E163D11BE8D865 1-80DB B8AC6FBE26E1
1E163D1220FB46C 1-80DB B8AC6FBE26E1
Вы можете видеть, что guid, созданные на одной машине с помощью UuidCreateSequential
, будут вместе, поскольку они являются хронологическими.
The 1
вы видите номер версии , в данном случае означающий основанный на времени uuid.Существует 5 определенных версий:
- 1: версия на основе времени (
UuidCreateSequential
) - 2: версия DCE Security со встроенными идентификаторами POSIX
- 3: имяверсия на основе хэширования MD5
- 4: случайно или псевдослучайно сгенерированная версия (
UuidCreate
) - 5: версия на основе имени, использующая хэширование SHA-1
Предоставление:
Timestamp Version Node
=============== ======= ==== ============
1E163D11BE8D85D 1 80DB B8AC6FBE26E1
1E163D11BE8D85E 1 80DB B8AC6FBE26E1
1E163D11BE8D85F 1 80DB B8AC6FBE26E1
1E163D11BE8D860 1 80DB B8AC6FBE26E1
1E163D11BE8D861 1 80DB B8AC6FBE26E1
1E163D11BE8D862 1 80DB B8AC6FBE26E1
1E163D11BE8D863 1 80DB B8AC6FBE26E1
1E163D11BE8D864 1 80DB B8AC6FBE26E1
1E163D11BE8D865 1 80DB B8AC6FBE26E1
1E163D1220FB46C 1 80DB B8AC6FBE26E1
Последнее слово содержит две вещи.
Младшие 12 битов являются машинно-заданными Тактовая последовательность число:
Timestamp Version Clock Sequence Node
=============== ======= = ================ ============
1E163D11BE8D85D 1 8 0DB B8AC6FBE26E1
1E163D11BE8D85E 1 8 0DB B8AC6FBE26E1
1E163D11BE8D85F 1 8 0DB B8AC6FBE26E1
1E163D11BE8D860 1 8 0DB B8AC6FBE26E1
1E163D11BE8D861 1 8 0DB B8AC6FBE26E1
1E163D11BE8D862 1 8 0DB B8AC6FBE26E1
1E163D11BE8D863 1 8 0DB B8AC6FBE26E1
1E163D11BE8D864 1 8 0DB B8AC6FBE26E1
1E163D11BE8D865 1 8 0DB B8AC6FBE26E1
1E163D1220FB46C 1 8 0DB B8AC6FBE26E1
Это постоянное значение для всей машины увеличивается, если:
- вы переключили сетевые карты
- вы сгенерировали UUID менее чем за 100 нс от последней (и метка времени столкнулась бы)
Итак, опять-таки, любой гид создан UuidCreateSequential
будет (в идеале) иметь одинаковое число Clock Sequence , что делает их "близкими" друг к другу.
Последние 2 бита называются Variant ,и всегда установлен в двоичный файл 10
:
Timestamp Version Variant Clock Sequence Node
=============== ======= ======= ================ ============
1E163D11BE8D85D 1 8 0DB B8AC6FBE26E1
1E163D11BE8D85E 1 8 0DB B8AC6FBE26E1
1E163D11BE8D85F 1 8 0DB B8AC6FBE26E1
1E163D11BE8D860 1 8 0DB B8AC6FBE26E1
1E163D11BE8D861 1 8 0DB B8AC6FBE26E1
1E163D11BE8D862 1 8 0DB B8AC6FBE26E1
1E163D11BE8D863 1 8 0DB B8AC6FBE26E1
1E163D11BE8D864 1 8 0DB B8AC6FBE26E1
1E163D11BE8D865 1 8 0DB B8AC6FBE26E1
1E163D1220FB46C 1 8 0DB B8AC6FBE26E1
Так что у вас это есть.Последовательные руководства являются последовательными;и если вы создадите их на одном и том же компьютере , они будут "рядом" друг с другом в базе данных.
Но вы хотите знать, что на самом деле происходит с двумя последовательными UUID, созданнымина разных компьютерах.
Используя наши новые знания о руководствах версии 1, давайте сконструируем два guid для одной и той же временной метки с разных машин, например:
{1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1}
{1BE8D85D-63D1-11E1-80DB-123456789ABC}
Сначала давайте вставим группу guid с последовательными временными метками.Сначала создайте временную таблицу для хранения нашего руководства, и cluster по guid:
--DROP table #uuidOrderingTest
CREATE TABLE #uuidOrderingTest
(
uuid uniqueidentifier not null
)
CREATE clustered index IX_uuidorderingTest_uuid ON #uuidOrderingTest
(
uuid
)
Теперь вставьте данные:
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D866-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1}')
Примечание: я вставляю их в случайном порядке временных меток, чтобы проиллюстрировать, что SQL Server будет кластеризовать их.
Получить строки обратно и посмотреть, в каком порядке они расположены в последовательном (временная метка) порядке:
SELECT * FROM #uuidOrderingTest
uuid
------------------------------------
1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D866-63D1-11E1-80DB-B8AC6FBE26E1
Теперь давайте вставим guid с:
- теми же метками времени
- , но с другим узлом (т. Е. MAC-адресом):
Вставьте новые направляющие с «другого» компьютера:
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D866-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D862-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D861-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85E-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D864-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D863-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85F-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D85D-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D865-63D1-11E1-80DB-123456789ABC}')
INSERT INTO #uuidOrderingTest (uuid) VALUES ('{1BE8D860-63D1-11E1-80DB-123456789ABC}')
и получите результат:
uuid
------------------------------------
1BE8D85D-63D1-11E1-80DB-123456789ABC
1BE8D85E-63D1-11E1-80DB-123456789ABC
1BE8D85F-63D1-11E1-80DB-123456789ABC
1BE8D860-63D1-11E1-80DB-123456789ABC
1BE8D861-63D1-11E1-80DB-123456789ABC
1BE8D862-63D1-11E1-80DB-123456789ABC
1BE8D863-63D1-11E1-80DB-123456789ABC
1BE8D864-63D1-11E1-80DB-123456789ABC
1BE8D865-63D1-11E1-80DB-123456789ABC
1BE8D866-63D1-11E1-80DB-123456789ABC
1BE8D85D-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85E-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D85F-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D860-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D861-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D862-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D863-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D864-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D865-63D1-11E1-80DB-B8AC6FBE26E1
1BE8D866-63D1-11E1-80DB-B8AC6FBE26E1
Итак, у вас это есть.Порядок SQL Server Узел до Метка времени .Uuid, созданный на разных машинах, не будет сгруппирован вместе.Было бы лучше, если бы это не было сделано, но что ты будешь делать?