Сведения о вопросе

1234123213

00:55, 19th August, 2020

Теги

.net   sql-server    

Почему Guid.ToString() меняет порядок байтов на обратный?

Просмотров: 476   Ответов: 1

Мы храним некоторые Guid в базе данных MS SQL. Есть какой-то устаревший код, который делает Guid.ToString() , а затем передает их в varchar(64) , и есть какой-то новый код, который передает их с помощью параметра уникального идентификатора. Когда вы смотрите на результаты с помощью MS SQL Management studio, они выглядят по-другому. Порядок байтов первых трех блоков меняется на противоположный, но последний остается тем же самым. Почему?



  Сведения об ответе

baggs

02:11, 1st August, 2020

Поля Uniqueidentifier на сервере Sql могут быть индексированы, как и 'backwards'.

Идентификаторы GUID могут быть созданы как из информации о конкретной машине, так и из информации 'event-time'.

GUID по умолчанию в .Net является случайным, но вы можете получить последовательные GUID из него с помощью вызова extern:

[DllImport( "rpcrt4.dll", SetLastError = true )]
static extern int UuidCreateSequential( out Guid guid );

Это поможет вам идентификаторы, основанные на ваш адрес MAC ( MSDN документы), которые являются последовательными.

Если вы .ToString() эти последовательные GUID, то вы увидите, что первая часть строки изменяется, в то время как rest остается постоянной.

Это делает проверку равенства между GUID быстрее (так как различия будут в начале) и улучшает вариацию для усеченных.

Для поиска столбцов SqlServer строит индексы аналогично телефонному справочнику или словарю. Поиск слов, начинающихся с "Over*", гораздо быстрее, чем поиск слов, заканчивающихся на "* flow".

Это означает, что для сервера Sql любые последовательные GUID должны храниться сначала с повторяющимся значением, поэтому он сохраняет их задом наперед.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться