Guid что это такое
Guid что это такое
Что такое GUID и зачем он нужен
Как‐то в один прекрасный день корпорация Open Software Foundation придумала концепцию UUID — Universally Unique Identifier, вселенски уникального идентификатора. Она взяла 128‐битное число и написала для его вычисления специальный алгоритм, более‐менее равномерно выдающий значения из такого огромного диапазона. Вероятность выдачи алгоритмом двух одинаковых чисел невелика, на практике можно говорить, что любое новое число UUID будет уникально.
Корпорация Microsoft взяла на вооружение эту мысль и число UUID без изменения, назвала его немного по‐другому: GUID, то есть Globally Unique Identifier, глобально уникальный идентификатор.
Применение
Корпорация Microsoft применяет GUID в следующих случаях:
Ты тоже можешь использовать GUID в своих целях, например, так:
Определение GUID
GUID — это беззнаковое целое 128‐битное число. Ничего таинственного и сверхъестественного.
Тип данных «128‐битное число» в языке программирования не предусмотрен, но программисты из Microsoft элегантно выкрутились из ограничения, представив такое число в виде стуктуры.
Структура GUID
В заголовочном файле win\guiddef.bi (входит в windows.bi ) тип данных GUID объявлен в виде структуры:
По порядку следования байт числа:
IID и CLSID
IID (идентификатор интерфейса) и CLSID (идентификатор класса) — это псевдонимы GUID:
REFGUID, REFIID и REFCLSID
Объявление GUID
В тексте
Ты уже наверняка где‐нибудь встречал похожие строки GUID:
Первая группа кодирует 32‐битное беззнаковое целое, вторая и третья группы — два 16‐битных беззнаковых целых, четвёртая и пятая — восемь 8‐битных беззнаковых целых.
В коде
Но этот вариант недостаточно гибкий, так как работает на уровне одного файла (одной единицы трансляции).
Через макросы
В случае, когда одно и то же значение GUID необходимо использовать в нескольких файлах, то его объявляют в одном из общих заголовочных файлов как внешнюю константную переменную:
Затем создают заголовочный файл Guids.bas с макросами:
И уже файле реализации Guids.bas прописывают непосредственно значения GUID через макросы:
Функции для работы с GUID
CoCreateGUID
Параметры
Возвращаемое значение
Макросы IsEqualGUID, IsEqualIID, IsEqualCLSID и InlineIsEqualGUID
Предназначены для сравнения двух GUID, IID или CLSID.
Макросы IsEqualGUID, IsEqualIID и IsEqualCLSID сравнивают два GUID через функцию memcmp(), а InlineIsEqualGUID делает это в коде, побайтово.
StringFromGUID2
Заполняет буфер строкой из GUID в формате реестра.
Параметры
Возвращаемое значение
В случае успеха функция возвратит количество записанных символов, включая нулевой.
В случае ошибки, когда буфер под строку слишком мал, вернёт 0.
StringFromIID и StringFromCLSID
Возвращают строку из IID или CLSID в формате реестра.
Параметры
Возвращаемое значение
IIDFromString и CLSIDFromString
Заполняют структуры IID или CLSID из строки GUID в формате реестра.
Параметры
Возвращаемое значение
Примеры
Генератор GUID
В этом простом примере посмотрим как создать GUID и вывести его на консоль.
«Пакетные файлы» создали этот сайт 11 марта 2016 года
Guid Структура
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет глобальный уникальный идентификатор (GUID).
Примеры
В следующем примере класс используется System.Runtime.InteropServices.GuidAttribute для назначения GUID интерфейсу и определяемого пользователем класса. Он извлекает значение GUID путем вызова GetCustomAttribute метода и сравнивает его с двумя другими идентификаторами GUID, чтобы определить, равны ли они.
Обратите внимание, что GuidAttribute атрибут обычно используется в приложении для предоставления типа COM. При компиляции этого примера можно запустить средство регистрации сборок (Regasm.exe) в созданной сборке, чтобы создать файлы реестра (REG) и библиотеки типов (TLB). REG-файл можно использовать для регистрации coclass в реестре, а TLB-файл может предоставлять метаданные для COM-взаимодействия.
Комментарии
GUID — это 128-разрядное целое число (16 байт), которое можно использовать во всех компьютерах и сетях, где требуется уникальный идентификатор. Такой идентификатор имеет очень низкую вероятность дублирования.
Конструкторы
Инициализирует новый экземпляр структуры Guid с использованием указанного массива байтов.
Инициализирует новый экземпляр структуры Guid с использованием заданных целых чисел и байтов.
Инициализирует новый экземпляр структуры Guid с использованием заданных целых чисел и массива байтов.
Инициализирует новый экземпляр структуры Guid с использованием значения, представленного заданным диапазоном байтов только для чтения.
Инициализирует новый экземпляр структуры Guid с использованием значения, представленного заданной строкой.
Инициализирует новый экземпляр структуры Guid с использованием указанных целых чисел без знака и байтов.
Доступный только для чтения экземпляр структуры Guid, значение которой состоит только из нулей.
Методы
Сравнивает этот экземпляр с заданным объектом Guid и возвращает значение, указывающее, как соотносятся значения этих объектов.
Сравнивает этот экземпляр с заданным объектом и возвращает значение, указывающее, как соотносятся значения этих объектов.
Возвращает значение, позволяющее определить, представляют ли этот экземпляр и заданный объект Guid одно и то же значение.
Возвращает значение, показывающее, равен ли экземпляр указанному объекту.
Возвращает хэш-код данного экземпляра.
Инициализирует новый экземпляр структуры Guid.
Преобразует диапазон символов только для чтения, представляющий GUID, в эквивалентную структуру Guid.
Анализирует диапазон символов в значение.
Преобразовывает строковое представление объекта GUID в эквивалентную структуру Guid.
Анализирует строку в значение.
Преобразует диапазон символов, представляющих GUID, в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Преобразует строковое представление GUID в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Возвращает массив байтов из 16 элементов, содержащий значение данного экземпляра.
Возвращает строковое представление значения этого экземпляра в формате реестра.
Возвращает строковое представление значения этого экземпляра Guid в соответствии с заданным описателем формата.
Возвращает строковое представление значения этого экземпляра класса Guid в соответствии с заданным описателем формата и сведениями об особенностях форматирования, связанных с языком и региональными параметрами.
Пытается отформатировать текущий экземпляр GUID в указанный диапазон символов.
Преобразует указанный диапазон символов только для чтения, содержащий представление GUID, в эквивалентную структуру Guid.
Пытается проанализировать диапазон символов в значение.
Преобразовывает строковое представление объекта GUID в эквивалентную структуру Guid.
Пытается проанализировать строку в значение.
Преобразует диапазон символов, представляющий GUID, в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Преобразует строковое представление GUID в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Пытается записать текущий экземпляр GUID в диапазон байтов.
Операторы
Указывает, равны ли значения двух указанных объектов Guid.
Сравнивает два значения, чтобы определить, какой из них больше.
Сравнивает два значения, чтобы определить, какое значение больше или равно.
Указывает, верно ли, что значения двух указанных объектов Guid не равны.
Сравнивает два значения, чтобы определить, что меньше.
Сравнивает два значения, чтобы определить, что меньше или равно.
Явные реализации интерфейса
Сравнивает этот экземпляр с заданным объектом Guid и возвращает значение, указывающее, как соотносятся значения этих объектов.
Возвращает строковое представление значения этого экземпляра в соответствии с заданным описателем формата и сведениями об особенностях форматирования, связанных с языком и региональными параметрами.
Пытается отформатировать значение текущего экземпляра в указанный диапазон символов.
Евангелие от GUID
Разбираясь с новым Visual C# 2008 (он настолько бесплатный для начинающих разработчиков, что я не удержался), нашел новое для себя слово в науке и технике — GUID.
ПС: Если будет интересно, то выложу перевод второй части, где автор отвечает на комменты к первой статье.
Евангелие от GUID
В Евангелие от GUID есть только одна заповедь:
I. Всегда используй GUID для уникальной идентификации строки таблицы.
При приеме новых сотрудников в команду это — одно из первых правил, которым я их обучаю. Почти всегда поначалу они смотрят на меня с видом щенка с торчащими ушами и склоненной набок головой, как бы говоря «как это?»
1) Мне не нужно совершать дополнительных выборок, а это — увеличение производительности!
Существует множество причин для использования GUID в качестве первичного ключа. Главная для меня напрямую связана с тем, как я строю объектные модели. Я предпочитаю создавать «new» экземпляр объекта без совершения выборки. Так, создавая объект Order (заказ) я не буду обращаться к базе данных для получения OrderID (OrderGUID в моем мире), как я бы делал в случае с int OrderID. На этом уровне еще не слишком впечатляет, да? Подумайте вот о чем: я создаю объект Order с OrderGUID, потом объекты OrderLineItem (строки заказа) с OrderLineItemGUID без ЕДИНОГО разрыва обращения к БД. В случае с int я бы сделал 11 обращений.
Следующая причина всегда использовать GUID — объединение данных (merging), оказывавшееся необходимым бессчетное количество раз. До того как я увидел свет, я тоже использовал int или что-то еще, чтобы сделать строку уникальной, но когда мне приходилось сливать данные из раных источников, я делел специальные преобразования.
DB1 (Клиент 1):
Order (таблица заказов)
OrderID = 1
CustomerID = 1
DB2 (Клиент 2):
Order
OrderID = 1
CustomerID = 1
Если Клиент 1 приобретает Клиента 2 и мне нужно слить их данные в единую БД, мне придется поменять чьи-то OrderID и CustomerID на какие-нибудь int значения, которые не используюся, после чего сделать update большому количеству записей, а, возможно и поплясать с бубном и с опорными значениями (seed values). Умножьте это на десятки таблиц, учтите миллионы строк данных, и у бедитесь, что передо мной стоит ДЕЙСТВИТЕЛЬНО сложная задача, которая потребует дофига тестирования после написания SQL и/или кода.
Однако, если я следую Евангелию от GUID:
В этом случае, все, что нужно сделать сводится к обычной вставке всех строк из одной БД в другую. Никаких преобразований, никаких замороченных тестов, просто, удобно и действенно. Недавно мне пришлось проделать эту операцию с БД двух моих клиентов AT&T и Cingular. Все «преобразование» заняло 45 минут.
Другой простой пример: представьте, что ваши клиенты часто работают удаленно в оффлайне, и вам приходится закачивать их данные в общую БД при подключении. Теперь это проще, чем у ребенка конфету отнять… © Если вы верите в GUID. Вы можете легко таскать данные между базами.
3) Типо-независимость
Например, чтобы получить все заметки по поставщику, достаточно создать простую связь (join) Note.ParentGUID к Vendor.VendorGUId. Не нужны никакие индикаторы типов, не нужно выдумывать, какие таблицы связывать, не нужно кучи ссылочных таблиц, чтобы понять с каким типом объекта связана строка.
Вы удивитесь, узнав насколько часто используется этот небольшой прием. Недавно мы добавили «аудит» к одному из наших приложений, в котором хотели выяснить кто что удалял, добавлял или изменял в БД. Мы просто добавили несколько строчек кода к методу DataContext SubmitChanges() (мы используем только LINQ в этом приложении) для создания соответствующей записи в таблице аудита. При создании нового объекта или типа в приложении запись в эту таблицу происходит автоматически, что позволяет нам не париться написанием специального «аудиторского» кода при добавлении новых типов данных в приложении.
Существует много менее очевидных причин для использования GUID, но есть одна, которую я не предвидел заранее и за которую я благодарю GUID, ибо он и только он спас миллионы долларов моему клиенту… да, я сказал МИЛЛИОНЫ!
Я разрабатывал систему управления автоматическими выплатами за размещение рекламы для крупного клиента. Они должны были иметь возможность по нажатию кнопки оплачивать счета общей суммой в миллионы долларов. В двух словах, по нажатию кнопки наша система генерирует файл с очередью и отправляет его их платежному серверу, который сгенерирует чеки… и денежки уйдут. Конечно, я использовал GUID, чтобы идентифицировать все и вся, поэтому когда платежный сервер генерировал файл сверки, я легко мог прогнать его по своей базе.
На нашем сайте была развернута рабочая БД клиента и тестовая БД, слегка устаревшая копия рабочей (на пару месяцев). В процессе тестирования кто-то на их стороне увидел один из наших тестовых файлов с очередью оплат и, не долго думая, скормил их платежному серверу. Ну, дальше вы поняли… Клиент заплатил куче действительных поставщиков контента дважды (один раз по реальному запросу, второй раз — по тестовому), а также еще и не совсем нормальным поставщикам (например тем, что уже не размещали рекламу, ведь тестовая БД устарела на пару месяцев). Вот так, без каких-либо косяков с моей стороны, я получил ужасную помойку в данных… ну по крайней мере так думал мой клиент. Однако, поскольку все мои записи о выплатах имели GUID, я мог легко выделить те записи, что пришли из тестовой базы, чтобы отменить платежи по ним. Представьте, если бы я использовал INT, у меня не было бы способа узнать из какой базы пришел запрос PaymentID = 1000, например.
Ну так как же это помогло спасти миллионы? Просто… умножьте тысячи запросов на штраф за отмену платежа ($20-30). И еще на три, поскольку такая ошибка повторилась три раза!
Ну а есть ли недостатки у GUID?
Если кратко, то да, есть. Однако они, настолько незначительны, что не могут изменить моего мнения. Наиболее очевидный из них — это написание SQL запросов вручную (кгда надо что-то найти).
SELECT * FROM ORDER WHERE ORDERID = 12
гораздо легче, чем
Еще один недостаток — небольшое снижение производительности у связей, построенных на базе gUID, по сравнению с INT. Но по моему опыту даже при использовании таблиц с многомиллионным количеством строк, это никогда не становилось проблемой. Несколько миллисикунд задержки — небольшая цена за все прелести GUIDа.
Опробуйте эту технику в каком-нибудь небольшом проекте, особенно если все еще настроены скептично. Думаю, она окажется более полезной чем вы могли мечтать.
Простыми словами: GUID в системе «Меркурий»
Производители молока уже давно начали работу с системой «Меркурий», однако на форумах Россельхознадзора фермеры не прекращают задавать технические вопросы по работе с ней. Многие спрашивают, что такое «гуиды», которые у них уточняют заказчики, и где их найти. Milknews объясняет, что такое GUID и как не запутаться в похожих записях.
Для того чтобы правильно оформлять и гасить ветеринарные документы на молочную продукцию, компании обмениваются информацией об организациях и продукции. Эти данные вносятся в систему «Меркурий», по которой Россельхознадзор прослеживает путь подконтрольной продукции по российскому рынку.
Если бы производители и поставщики записывали данные только словами, то это бы неизбежно привело к путанице. В частности, лишняя точка или сокращение может превратить один и тот же товар в два разных. Именно для того, чтобы не допустить ошибок, в компьютерных базах данных – в том числе и в «Меркурии» – существуют «гуиды».
Что такое GUID?
Глобальный уникальный идентификатор, или GUID – это код, состоящий из 32 цифр и букв, разделённых дефисами. Программисты используют коды вместо словесных наименований для того, чтобы однотипные записи не дублировались друг с другом.
В системе «Меркурий» существуют несколько типов GUID. Обычно контрагенты, работающие с производителями подконтрольной продукции, запрашивают у них GUID 3 уровня, 4 уровня, хозяйствующего субъекта (ХС) и площадки.
Как узнать GUID 3 уровня?
Когда компания говорит об «уровнях», она имеет в виду уровни в справочнике номенклатуры ФГИС «Меркурий», в который записаны все наименования поднадзорных товаров.
Первые три уровня основаны на сведениях из Товарной номенклатуры ВЭД ЕЭС и указывают место продукции в её иерархии. Уровни описывают тип продукции (1 уровень; «пищевая продукция»), продукцию (2 уровень, «молоко и молочная продукция») и вид продукции (3 уровень, «творог»).
Четвёртый же уровень справочника предназначен для товарного наименования конкретной выпускаемой продукции. Подробней об уровнях справочника можно почитать в разборе, подготовленном Milknews ранее.
Чтобы узнать GUID 3 уровня в государственной системе, нужно:
Что делать, если контрагент просит GUID 4 уровня?
С юридической точки зрения, ничто не обязывает производителей молочной продукции работать со справочником 4 уровня. Однако многие торговые сети на практике настаивают на его использовании – как для готовности к будущему, так и для того, чтобы препятствовать появления разных GUID на одну и ту же продукцию.
Если вы договорились с контрагентом на обмен GUID 4 уровня, то в этом случае производителю стоит вести справочник готовой продукции, указывая при этом конкретное наименование товара (без «в ассортименте»). При подготовке к его ведению стоит открыть журнал продукции и проверить, есть ли у записей GUID. Если вы используете не государственный интерфейс, а интеграционное решение, то возможно, что оно уже составило справочник и назначило идентификаторы.
После перехода на новый уровень справочника GUID 4 уровня можно будет посмотреть таким же способом, как и третьего – через загрузку «Списка наименований продукции». В файле GUID 4 уровня будет записан как «наименование номенклатуры продукции».
Как узнать GUID предприятия?
В интерфейсе «Меркурия» можно узнать и GUID предприятия. Для этого нужно просто зайти в систему и, не выбирая предприятие, нажать кнопку с зелёной стрелкой рядом с заголовком «Выбор обслуживаемого предприятия».
Как узнать GUID хозяйствующего субъекта и площадки?
Помимо данных о товаре и предприятии, поставщики запрашивают у производителей идентификаторы ХС и площадки. Использование GUID позволяет избежать путаницы при нахождении нескольких юридических лиц – например, магазина, кафе и склада – по одному адресу.
Чтобы найти GUID, необходимо войти в личный кабинет «Цербер» в системе «Ветис» с данными, используемыми при входе в «Меркурий». После этого стоит выбрать из меню пункт «Хозяйствующий субъект» или «Площадка» – в зависимости от того, какой конкретно GUID вам нужен. В строке «Глобальный идентификатор в системе» будет указан нужный вам код.
Если вы ведёте документооборот через интеграционные решения, то вы можете узнать идентификаторы площадок, не заходя в государственную систему. Подробную информацию вы можете узнать в справочной системе или службе поддержки вашего поставщика интеграционного решения.
© Информационное агентство «Milknews» (2015-2019). Свидетельство о регистрации СМИ от 5 марта 2015г. ИА № ФC 77-60961, выдано Федеральной службой по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзор).
107078, г. Москва, Докучаев пер., дом 6, стр. 2
Тел. +7 (495) 114-51-29
E-mail:info@milknews.ru
Все права на любые материалы, опубликованные на сайте, защищены в соответствии с российским и международным законодательством об интеллектуальной собственности. Правообладатель допускает частичное цитирование информации и информационных материалов, в объеме, не превышающем 30%, с обязательным указанием имени автора (при наличии), наименования правообладателя (ИА «Milknews») и гиперссылки на источник заимствования. Без письменного разрешения правообладателя не допускается копирование и последующее распространение размещенных на сайте материалов в полном объеме.
Как получить уникальный идентификатор объекта, GUID?
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,402 * 10в38), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
Как с помощью запроса получить уникальный идентификатор:
Код 1C v 8.х
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x
Через WScript
Код 1C v 7.x
при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр( );
Синтаксис:
ЗначениеВСтрокуВнутр( )
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
— значение объекта агрегатного типа данных которое нужно преобразовать.
Guid что это такое
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2 128 или 3,4028×10 38 ), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала. Тем не менее, случаи совпадения были: на системе Windows 95 GUID’ы ярлыка запуска DOS-программ (.pif) и программы ZipMagic 2000 совпадали.
«GUID» называют некоторые реализации стандарта, имеющего название Universally Unique Identifier (UUID).
В тексте GUID записывается в виде строки из тридцати двух шестнадцатеричных цифр, разбитых на группы дефисами, и окружённой фигурными скобками:
Содержание
Реализация Microsoft
Например, ‘22345200-abe8-4f60-90c8-0d43c5f6c0f6’ [1] соответствует шестнадцатеричному 128-битному числу 0x00523422E8AB604F90C80D43C5F6C0F6
Максимальное значение в GUID соответствует десятичному числу 340 282 366 920 938 463 463 374 607 431 768 211 455.
Microsoft применяет GUID в OLE, COM и DCOM — например, в качестве идентификаторов для классов (CLSID), интерфейсов (IID), библиотек типов (LIBID). Использование GUID гарантирует, что две (возможно, несовместимые) версии одного компонента могут иметь одно и то же имя, но быть отличимыми по GUID.
Алгоритм, который Microsoft использовала для генерации GUID, был широко раскритикован. В частности, в качестве основы для генерации части цифр GUID использовался MAC-адрес сетевого адаптера, что означало, например, что по данному документу MS Word (также получающему при создании свой уникальный GUID) можно было определить компьютер, на котором он был создан. Позже Microsoft изменила алгоритм таким образом, чтобы он не включал в себя MAC-адрес.
Другие реализации
Также GUID — основа Таблицы разделов GUID, замены MBR в EFI.
Примечания
Ссылки
Полезное
Смотреть что такое «GUID» в других словарях:
guid — guid; guid·able; guid·ance; guid·er; guid·man; guid·sire; guid·wife; guid·willie; lan·guid·ly; lan·guid·ness; mis·guid·ance; pin·guid; pin·guid·i·ty; lan·guid; mis·guid·ed·ly; mis·guid·ed·ness; mis·guid·er; … English syllables
GUID — [Abk. für Global Unique Identifier], globale Identifikation … Universal-Lexikon
guid|er — «GY duhr», noun. 1. a person or thing that guides; guide; leader. 2. Guider, an adult leader associated with the Girl Guides … Useful english dictionary
GUID — Globally Unique Identifier Un GUID (abréviation de l anglais Globally Unique IDentifier) sert habituellement d identifiant unique pour un composant logiciel, par exemple un plugin. Sa taille est de 16 octets, soit 128 bits, décomposés en… … Wikipédia en Français
GUID — Ein Globally Unique Identifier (GUID) ist eine global eindeutige Zahl mit 128 Bit (das sind 16 Bytes), die in verteilten Computersystemen zum Einsatz kommt. GUID stellt eine Implementierung des Universally Unique Identifier Standards (UUID) dar.… … Deutsch Wikipedia
Guid — Ein Globally Unique Identifier (GUID) ist eine global eindeutige Zahl mit 128 Bit (das sind 16 Bytes), die in verteilten Computersystemen zum Einsatz kommt. GUID stellt eine Implementierung des Universally Unique Identifier Standards (UUID) dar.… … Deutsch Wikipedia
guid — ˈgœ̅d, ˈgu̅e̅d, ˈgid Scotland variant of good * * * guid «good», adjective, noun, interjection, adverb. Scottish. good. * * * guid Sc. form of good … Useful english dictionary
GUID Partition Table — (GPT), zu deutsch GUID Partitionstabelle, ist ein Standard für das Format von Partitionstabellen auf Festplatten oder anderen Datenträgern. Die Spezifikation ist Teil des UEFI Standards, der das BIOS in PCs ersetzen soll. GPT ist dabei der… … Deutsch Wikipedia
guid|ed-mis|sile — guid|ed missile «GY dihd», a missile that can be guided in flight to its target by means of radio signals from the ground or by automatic devices inside the missile which direct its course. Correction or alteration of the course of a missile in… … Useful english dictionary
Первичный ключ – GUID или автоинкремент?
Зачастую, когда разработчики сталкиваются с созданием модели данных, тип первичного ключа выбирается «по привычке», и чаще всего это автоинкрементное целочисленное поле. Но в реальности это не всегда является оптимальным решением, так как для некоторых ситуаций более предпочтительным может оказаться GUID. На практике возможны и другие, более редкие, типы ключа, но в данной статье мы их рассматривать не будем.
Ниже приведены преимущества каждого из вариантов.
GUID можно генерировать как на клиенте, так и самой базой данных — уже два варианта. К тому же, в MS SQL есть две функции для получения уникального идентификатора — NEWID и NEWSEQUENTIALID. Давайте разберемся, в чем их отличие и может ли оно быть существенным на практике.
Если использовать Entity Framework Code First, и объявить первичный ключ вот таким образом
в базе данных будет создана таблица с первичным кластерным ключом, который имеет значение по умолчанию NEWSEQUENTIALID(). Сделано это из соображений производительности. Опять же, в теории, вставлять новое значение в середину списка более накладно, чем добавление в конец. База данных, конечно же, не массив в памяти, и вставка новой записи в середину списка строк не приведет к физическому сдвигу всех последующих. Тем не менее, дополнительные накладные расходы будут — разделение страниц (page split). По итогу также будет сильная фрагментация индексов, которая может отразиться на производительности выборки данных. Неплохое объяснение того, как происходит вставка данных в кластеризованую таблицу, можно найти в ответах форума по этой ссылке.
Обратите внимание на то, что без специальной перестановки байт, GUID нельзя отдавать. Идентификаторы получатся корректные, но с точки зрения SQL сервера — непоследовательные, поэтому никакого выигрыша по сравнению с «обычным» GUID даже теоретически не получится. К сожалению, ошибочный код приведен во многих источниках.
К списку остается добавить пятый вариант — автоинкрементный первичный ключ. Других вариантов у него нет, так как на клиенте его генерировать нормально не получится.
С вариантами определились, но есть еще один параметр, который следует учесть при написании теста — физический размер строк таблицы. Размер страницы данных в MS SQL — 8 килобайт. Записи близкого или даже большего размера могут показать более сильный разброс производительности для каждого из вариантов ключа, чем на порядок меньшие записи. Чтобы обеспечить возможность варьировать размер записи, достаточно добавить в каждую из тестовых таблиц NVARCHAR поле, которое затем заполнять нужным количеством символов (один символ в NVARCHAR поле занимает 2 байта).
Тестирование
По этой ссылке находится проект с программой, которая была разработана с учетом указанных выше соображений.
Создание и оптимизация GUID
Использование уникальных идентификаторов CLSID позволяет избежать конфликтов имен между классами, так как идентификаторы CLSID не связаны с именами, используемыми в базовой реализации. Например, два разных поставщика могут писать классы с именем StackClass, но каждый из них имеет уникальный идентификатор CLSID и, следовательно, не может быть запутанным.
COM часто должен сопоставлять идентификаторы GUID (IID и CLSID) с некоторыми произвольным большим набором других значений. Разработчиком приложений вы можете ускорить такие поиски и тем самым повысить производительность системы, создав guid для приложения в виде блока последовательных значений.
Например, если нужно было ввести
Служебная программа uuidgen создаст блок UUID, аналогичный следующему:
Один из методов создания и отслеживания guid для всего проекта начинается с создания блока произвольно большого числа UUID, например 500. Например, если нужно было ввести
программа создаст 500 последовательных идентификаторов UUID и запишет их в указанный текстовый файл. Затем вы можете проверить этот файл в исходном дереве, предоставив один репозиторий для всех идентификаторов GUID, которые будут использоваться в проекте. Так как пользователям требуются идентификаторы GUID для своих частей проекта, они могут извлечь файл, принять все необходимые идентификаторы GUID, пометить их как принятые и оставить заметку о том, где они используются в коде или спецификации.
В дополнение к повышению производительности системы создание блоков последовательных GUID таким образом имеет следующие преимущества:
Guid что это такое
Добрый день! Уважаемые читатели и подписчики IT блога Pyatilistnik.org. В данной статье я приведу один из методов извлечения цифрового идентификатора приложения из реестра Windows. Правильное название: статистически уникальный 128-битный идентификатор
Что такое GUID?
Типы GUID
Разделы реестра, где нужно искать:
Как узнать GUID приложения
Пример вызова компонента Windows диспетчер устройств:
shell. <74246bfc-4c96-11d0-abef-0020af6b0b7a>,для запуска необходимо вызвать диалоговое окно «Выполнить» используя клавиши Win + R, прописать данный код и нажать«OK» Все значения
Раздел реестра HKEY_CLASSES_ROOTCLSID
Пример: нам нужен
Созданный файл реестра лучше всего открыть программой Notepad ++ познакомиться с которой можно в категории сайта «Офис».Если Вам понравился текстовой редактор Notepad ++ и Вы его установили, то правой клавишей мыши нажимаем на созданный файл реестра. В открывшемся меню выбираем «открыть с помощью Notepad ++ таким образом можно ознакомиться со структурой и синтаксисом файла реестра.
Выделяем значение, с помощью клавиш Ctrl + C копируем, вызываем диалоговое окно «Выполнить» и с помощью клавиш Ctrl + V вставляем, перед фигурными скобками прописываем Shell. и нажимаем«OK».
Как узнать GUID через PowerShell
Еще один вариант воспользоваться вот такой конструкцией:
Тут мы еще вывели пути расположения MSI пакетов для удаления приложения и его ремонту.
Как узнать GUID через CMD
Откройте cmd от имени администратора и выполните команду, которая создаст на диске C:\ файл с отчетом
Сказка про Guid.NewGuid()
Цель нашей сегодняшней сказки — развлечься как следует. Детективная история в поисках потерянного перфоманса с красивым финалом и эффектным результатом непосредственно связана с набором слов из предыдущего абзаца.
Художественное отступление, шутка на текущую тему. Читать совершенно не обязательно.
— О, Tux, давно не виделись! — Con, широко улыбаясь, выглядывал из распахнутого окна.
— Здравствуй, Con! Вот, вернулся ненадолго. Как дела, как жизнь?
— Да всё также. За жильё приходится платить всё больше и больше. Пугают всё время, что что-нибудь отключат или запретят. Но пока хорошо, красиво, удобно, привычно. Да и от старых вещей избавляться не хочется, мороки много с этим. Расскажи лучше, как твой переезд, каково там?
— Знаешь, Con, я толком понять не успел. Жильё бесплатное. Но обустраивать самому приходится. В целом, всё также. И одновременно всё не так… точно могу сказать, что переезжать было не просто. Тосковал по старому дому, привыкал к новому климату. От некоторых старых вещей пришлось избавляться, потому что нельзя с ними переезжать. Ещё, точно могу сказать, что жить там тяжелее. Как будто на само существование нужно тратить больше сил, больше внутренних ресурсов.
Tux на секунду задумался. Но быстро спохватился и увлеченно продолжил говорить.
— А недавно я заметил вообще интересную вещь! Я стал очень много времени проводить в придумывании уникальных имен всяким своим штукам. Не знаю почему. Раньше раз, и выдумывалось быстро. А сейчас, как только пытаюсь дать уникальный идентификатор чему-нибудь, так сразу зависаю надолго.
— Во дела.. а чего ты именно туда-то поехал, а, Tux?
— Да просто. Пингвинов хотел посмотреть, очень их люблю.
Каждый раз, когда мы хотим выдумать уникальный идентификатор для какой-нибудь сущности, чтобы она уж точно не была ни на что не похожей, первым в голову приходит Guid. Или, если назвать его имя полностью, Globally Unique Identifier.
Guid — это конкретная реализация стандарта UUID (Universally Unique Identifier).
Guid — это «случайные» 128 бит. Или, 2^128 вариантов (на самом деле чуточку меньше, там есть зарезервированные биты). Это ОЧЕНЬ много. Вероятность сгенерировать два одинаковых Guid’а невероятно мала. Настолько мала, что все условились считать их уникальными.
Guid — это не про security, это про uniqueness. То есть его не стоит использовать для криптографических целей или даже для генерации паролей. Хотя, нам повезло и на Windows (и даже на Linux) по факту прямо сейчас нам дают 122 бит энтропии. И вроде даже обещают не ломать это в будущем (в том же XML документе).
Guid — весьма интересная штука. И продолжать накидывать про неё фактов можно очень долго.
Дело было вечером, делать было нечего
Первые две строчки на скриншоте выше — это бессмысленные ожидающие потоки. Они практически ничего не потребляют у приложения, но занимают много времени, отчего всплыли в топ. Если их скрыть, то выйдет, что генерация гуидов занимает аж 8.6% от времени работы приложения (На Windows эта функция потребляла намного меньше):
Почему употребляется термин время, а не CPU?
Такие трейсы, снятые на Linux, померили нам время, проведённое всеми тредами приложения в этих стеках. Вне зависимости от того, работал ли CPU внутри этого стека. И в данный момент они попадают в категорию «UNMANAGED_CODE_TIME». В «CPU_TIME» находится только наш managed C# код.
На данный момент, на мой взгляд, на Windows дела со снятием и анализом трейсов обстоят несколько лучше.
Изучаем Guid.NewGuid()
Не то чтобы медленный Guid.NewGuid() был основной причиной нашей проблемы. Было очевидно, что разница в нескольких процентах от всего приложения — это не то, что мы ищем, расследуя разницу в полтора раза. Но всё-таки было интересно, что такого особенного в генерации гуида и откуда такая разница в зависимости от ОС.
Запускать в каком-нибудь WSL было бы неправильно. Это всё-таки эмулятор (на самом деле далеко нет, но такому бенчмарку доверять всё равно было бы нельзя). А процессоры машин разработчиков это не процессоры на проде.
Результат подтвердил то, что мы видели в трейсах:
Извините, скриншоты потерялись, остались лишь текстовые представления
Но легко повторить такой эксперимент самостоятельно. Дам лишь небольшой хинт. Если вы захотите считерить и собрать проект с бенчмарком у себя на рабочей машине, чтобы затем перенести лишь исполняемые файлы для запуска на другой виртуалке, разочарую вас. Нужно именно собрать проект на целевой машине и запускать бенчмарк из папки с проектом. Этому есть причины. BenchmarkDotNet умный, но хитрый. И хитрый, но умный 😉
Разница просто колоссальная. Создание Guid’а на Линуксе в 16 раз медленнее, чем на Винде! Давайте разбираться, почему так.
Разбираемся
Хочется заглянуть внутрь реализации и посмотреть, что же там такого интересного. Раз производительность зависит от ОС, доверять декомпиляции метода Guid.NewGuid() на своей рабочей машине неправильно. Отправляемся на гитхаб, где можно найти исходники. Находим там два файла с кусочками partial class’ов: Guid.Unix.cs и Guid.Windows.cs.
Кстати, сразу видим интересный комментарий, что генерация Guid’а на Linux’е намеренно пользуется криптографически стойким генератором случайных чисел. Как и в Windows. Но генерация гуида это всё ещё не рекомендуемый способ придумывать «действительно» криптостойкие ключи. Как минимум потому, что в нём есть один предсказуемый бит версии, а утечка хотя бы одного бита информации может быть фатальной.
Linux
Информация актуальна на момент написания статьи.
Также в истории коммитов можно найти, как добавлялись реализации для Apple, или как чинят билды под ARM. Всё-таки, как удобно иметь платформу, которая прячет от тебя весь этот кошмар в различиях операционных систем и даже архитектур.
Windows
Дак что в итоге?
Судя по ответам на гитхабе, цепочка вызовов на Windows просто быстрее, чем рассмотренное нами выше чтение из /dev/urandom на Linux, поскольку несет в себе меньше оверхеда на всякие системные штуки. Печально.
Как можно обойти эту нелепую ситуацию?
Давайте вернемся в самое начало, к трейсу. На самом деле, если поизучать его более пристально, то видно, что 100% всех гуидов в нашем приложении мы генерируем для телеметрии:
Что такое гуид? 16 байт. Random предназначен для того, чтобы генерировать int, то есть 4 байта. Давайте вызовем Random.Next() 4 раза и соберем из них Guid. Даже не будем выставлять нужные битики, как того требует RFC, кому они нужны. И ещё, да, мы потеряем целых 4 бита на знаковых битах int’а, поскольку Random генерирует только положительные числа. Из 128 бит осталось 124 псевдослучайных. Этого уж точно хватит на нашу телеметрию.
Реализация и снова бенчмарки
Снова запускаем наш бенчмарк, смотрим, что получилось:
Снова запускаем наш бенчмарк. Для сравнения запустим и старую и новую версию нашего собственного генератора Guid’ов.
Чудесно. Мы умеем генерировать не-криптостойкий «Guid» за 31 строчку кода. Который на Windows быстрее встроенного Guid.NewGuid() в
2 раза. А на Linux быстрее встроенного Guid.NewGuid() в
А можно ещё лучше?
Перед тем, как перейти ко второй фиче, сделаем небольшой исторический экскурс. Поначалу, генерация гуидов на Linux была в
100 раз медленнее, чем на Windows. Потому что из генератора случайных чисел читали по одному байту. Потом стали читать пачками, тем самым свели к текущему положению дел. Эта история должна была нас кое чему научить.
Давайте проверим, стало ли лучше? Снова запустим бенчмарк.
Я не стал приводить весь код бенчмарка, чтобы не нагромождать статью однотипным кодом. Поэтому просто дам краткую расшифровку:
GenerateInt32 — генерация вызовом метода random.Next() 4 раза.
GenerateInt64 — генерация вызовом метода random.NextInt64() 2 раза.
Чудесно. Мы умеем генерировать не-криптостойкий «Guid», который на Windows быстрее встроенного Guid.NewGuid() в
5 раз. А на Linux быстрее встроенного Guid.NewGuid() в
Извлечём практическую пользу
Не пропадать же добру.
Этот генератор Guid’ов уже давно крутится в куче сервисов. С помощью него мы генериуем идентификаторы спанов, трейсов, и прочих эвентов телеметрии. Код можно найти на гитхабе: GuidGenerator и одно из использований, генерация трейсов и спанов. И вся данная телеметрия успешно отправляется и обрабатывается в Hercules’е — системе сбора, хранения и обработки логов, метрик, распределённых трассировок и аннотаций.
Но тут не всё рассказано!
Как обычно, мы прошли мимо большого количества всяких интересностей:
А можем ли мы генерировать псевдослучайные числа ещё быстрее? Что на счет максимально быстрой реализации на SIMD? Конечно можем. Всех интересующихся направляю на SIMDxorshift. Здесь не буду утомлять кодом на C и SIMD-инструкциями.
Почему на виртуалках одинаковой конфигурации наш полностью managed-код с использованием Random все равно имеет разную скорость исполнения на Linux и Windows? Сложно сказать. Разница небольшая и, возможно, виртуалки просто крутились на разных гипервизорах с разной производительностью железа.
Если углубляться в каждый нюанс, статья получится бесконечной. Но вы всегда можете предложить какую-нибудь конкретную тему для следующей статьи в комментариях или в личке.
Что такое GUID? Зачем и где мне его использовать?
Что такое GUID? Зачем и где мне его использовать?
Я видел ссылки на GUID во многих местах, а в википедии но не очень понятно, где его использовать. Если бы кто-то мог на это ответить, было бы хорошо. Спасибо
Их также иногда называют UUID (универсальный уникальный идентификатор).
Использование Guid в качестве первичного ключа замедлит работу базы данных, поскольку индексирование числа выполняется намного быстрее, чем индексирование varchar.
Да, поэтому я использовал это как пример места, где вам НЕ нужен GUID.
Это компромисс между чтением и записью. Также существуют накладные расходы при посредничестве сложных уникальных целочисленных ключей. В большинстве небольших баз данных использование ключей guid не повлияет на производительность. В больших базах данных это может стать проблемой. Кроме того, гиды являются varchars и не индексируются как таковые.
GUID = Глобальный уникальный идентификатор.
Используйте его, если хотите однозначно идентифицировать что-то в глобальном контексте.
Что касается того, когда вам не нужен GUID, это когда счетчик, которым вы управляете (так или иначе, например, тип SERIAL SQL или последовательность), увеличивается. Индексирование «текстового» значения (GUID в текстовой форме) или 128-битного двоичного значения (которым является GUID) намного дороже, чем целочисленное.
«зачем вам GUID?» Думаю, в этом был вопрос.
GUID технически означает глобальный уникальный идентификатор. На самом деле это 128-битная структура вряд ли, которая когда-либо повторяет или создает конфликт. Если вы делаете математику, область значений находится в нециллионы.
Используйте гиды, когда у вас есть несколько независимых систем или клиентов, генерирующих идентификаторы, которые должны быть уникальными.
Например, если у меня есть 5 клиентских приложений, создающих и вставляющих данные транзакций в таблицу, имеющую уникальное ограничение на идентификатор, тогда используйте guids. Это предотвращает необходимость заставлять клиента сначала запрашивать выданный идентификатор у сервера.
Это также отлично подходит для объектных фабрик и систем, которые имеют множество типов объектов, хранящихся в разных таблицах, где вы не хотите, чтобы какие-либо 2 объекта имели одинаковый идентификатор. Это значительно упрощает реализацию кэширования и очистки схем.
GUID расшифровывается как «Глобальный уникальный идентификатор», и вы используете его, когда хотите иметь, например, глобальный уникальный идентификатор.
Например, в RSS-каналах у вас должен быть GUID для каждого элемента в канале. Таким образом, программа чтения каналов сможет отслеживать, прочитали ли вы этот элемент или нет. Без GUID это было бы невозможно сказать.
Если вам нужно сгенерировать идентификатор, который должен быть уникальным в течение всего жизненного цикла вашего приложения, вы используете GUID.
Представьте, что у вас есть сервер с сеансами. Если вы дадите каждому сеансу GUID, вы уверены, что он будет уникальным для каждого сеанса, когда-либо созданного вашим сервером. Это полезно для отслеживания ошибок.
128-битный глобальный уникальный идентификатор. Вы можете генерировать GUID с сегодняшнего дня до заката, и вы никогда не создадите один и тот же GUID дважды, как и никто другой. Они часто используются с COM.
Что касается, например, того, для чего вы бы их использовали, мы используем их в одном из наших продуктов. Наши пользователи могут создавать категории и карточки на различных устройствах. Мы хотим убедиться, что не путаем категорию, созданную на одном устройстве, с категорией, созданной на другом, поэтому важно, чтобы идентификаторы были уникальными, независимо от того, кто их генерирует, где они генерируют и когда они их генерируют. Поэтому мы используем GUID (на самом деле мы используем нашу собственную схему с использованием 64-битных чисел, но они похожи на GUID).
В дополнение ко всем другим ответам вот онлайн-генератор GUID:
GUID (or UUID) is an acronym for ‘Globally Unique Identifier’ (or ‘Universally Unique Identifier’). It is a 128-bit integer number used to identify resources. The term GUID is generally used by developers working with Microsoft technologies, while UUID is used everywhere else.
How unique is a GUID?
128-bits is big enough and the generation algorithm is unique enough that if 1,0000,000,000 GUIDs per second were generated for 1 year the probability of a duplicate would be only 50%. Or if every human on Earth generated 600,000,000 GUIDs there would only be a 50% probability of a duplicate.
How are GUIDs used?
GUIDs are used in software development as database keys, component identifiers, or just about anywhere else a truly unique identifier is required. GUIDs are also used to identify all interfaces and objects in COM programming.
См. Мой комментарий к Ответ Куррана. Строго говоря, все GUID являются UUID, но не все UUID являются GUID.
Мне проще думать о них как о «128-битных случайных значениях». По сути, это то, чем они являются. Есть несколько алгоритмов для включения небольшого количества информации в несколько цифр вашего GUID (таким образом, случайная часть становится немного меньше), но все же это довольно большие почти случайные значения.
Поскольку они такие большие, маловероятно, что очень сильно когда-либо будут сгенерированы два одинаковых идентификатора GUID. Для всех практических целей каждый когда-либо созданный GUID уникален в мире.
Я оставлю это вам, чтобы выяснить, где их использовать, но в других ответах уже есть несколько примеров. Дайте волю своему воображению. 🙂
Возможно, их проще рассматривать как «128-битные случайные значения», но при злоупотреблении это может привести к некоторым проблемам. У Рэймонда Чана есть хорошая запись о них blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Однако я отмечу, что в наши дни наиболее распространенным идентификатором GUID является версия 4 GUID, который на самом деле почти все случайные биты.
По сути, это 128-битное число, которое генерируется способом (см. RFC 4112 http://www.ietf.org/rfc/rfc4122.txt), что делает создание дубликатов практически невозможным. Таким образом, я могу генерировать идентификаторы GUID без необходимости их предоставления какой-либо сторонней организацией, чтобы убедиться, что они уникальны.
Как правило, вы можете думать о GUID как о серийном номере, который может быть сгенерирован кем угодно в любое время, и они будут знать, что серийный номер будет уникальным.
Другие способы получить уникальные идентификаторы включают получение доменного имени. Чтобы гарантировать уникальность доменных имен, вы должны получить их от какой-либо организации (в конечном итоге администрируемой ICANN).
Поскольку идентификаторы GUID могут быть громоздкими (с точки зрения восприятия человеком они представляют собой строку шестнадцатеричных чисел, обычно сгруппированных следующим образом: aaaaaaaa-bbbb-cccc-dddd-ffffffffffff), некоторые пространства имен, которым требуются уникальные имена в разных организациях, используют другую схему ( часто на основе доменных имен в Интернете).
Итак, пространство имен для пакетов Java по соглашению начинается с доменного имени организации (в обратном порядке), за которым следуют имена, определенные определенным образом организации. Например, пакет Java может называться:
Это означает, что решение конфликтов имен становится обязанностью каждой организации.
Что именно является идентификатор GUID? Почему и где я должен его использовать?
Что такое GUID? Почему и где я должен его использовать?
Я видел ссылки на GUID во многих местах, и в Википедии, но не очень ясно, где его использовать. Если бы кто-нибудь мог ответить на этот вопрос, было бы здорово. Спасибо
15 ответов
GUID технически означает глобальный уникальный идентификатор. На самом деле это 128-битная структура, которая является вряд ли чтобы когда-либо повторить или создать столкновение. Если вы делаете математику, домен значений в undecillions.
используйте GUID, когда у вас есть несколько независимых систем или клиентов, генерирующих ID, которые должны быть уникальными.
например, если у меня есть 5 клиентских приложений, создающих и вставляющих транзакционные данные в таблицу это имеет уникальное ограничение на ID, а затем использует GUID. Это предотвращает необходимость принудительного запроса клиентом выданного идентификатора с сервера.
Это также отлично подходит для фабрик объектов и систем, которые имеют множество типов объектов, хранящихся в разных таблицах, где вы не хотите, чтобы любые 2 объекта имели одинаковый идентификатор. Это упрощает реализацию схем кэширования и очистки.
GUID-это комбинация времени (в очень малых долях секунды) (поэтому она гарантированно отличается от любой GUID, определенный до или позже), и номер, определяющий ваше местоположение (иногда берется из MAC-адреса вашей сетевой карты) (так что он наверняка будет отличаться от любого другого GUID, определенного прямо сейчас кем-то другим).
Они также иногда известны как UUID (универсальный уникальный идентификатор).
в дополнение ко всем другим ответам, вот онлайн генератор GUID:
GUID (или UUID) является аббревиатурой «Глобальный уникальный идентификатор» (или «Универсальный Уникальный Идентификатор»). Он это 128-разрядное целое число, используемое для определите ресурсы. Термин GUID-это обычно используется разработчиками с технологиями Microsoft, в то время как UUID используется везде.
насколько уникален GUID?
128-бит достаточно большой и алгоритм генерации достаточно уникален что если 1,0000,000,000 GUIDs в во-вторых были произведены для 1 года вероятность дублировать будет только 50%. Или если каждый человек на Земле создается 600,000,000 там идентификаторы будет только 50% вероятности дубликат.
Как используются GUID?
GUID используются при разработке программного обеспечения как ключи базы данных, компонент идентификаторы, или где угодно else поистине уникальный идентификатор требуемый. GUID также используются для определить все интерфейсы и объекты в Программирование COM.
это в основном 128-битное число, которое генерируется таким образом (см. RFC 4112 http://www.ietf.org/rfc/rfc4122.txt), что делает практически невозможным создание дубликатов. Таким образом, я могу генерировать GUID без какой-либо сторонней организации, которая должна дать их мне, чтобы гарантировать, что они уникальны.
одно широко распространенное использование GUID в качестве идентификаторов для COM-сущностей в Windows (классы, typelibs, интерфейсы и т. д.). Используя GUID, разработчики могут создавать свои com-компоненты, не обращаясь в Microsoft за уникальным идентификатором. Несмотря на то, что идентификация com-сущностей является основным использованием GUID, они используются для многих вещей, которые нуждаются в уникальных идентификаторах. Некоторые разработчики генерируют GUID для записей базы данных, чтобы предоставить им ID, который можно использовать, даже если они должны быть уникальными во многих различных базах данных.
Как правило, вы можете думать о GUID как серийный номер, который может быть создан кем угодно в любое время, и они будут знать, что серийный номер будет уникальным.
другие способы получения уникальных идентификаторов включают в себя получение доменного имени. Чтобы обеспечить уникальность доменных имен, вы должны получить его от какой-либо организации (в конечном счете, управляемой ICANN).
потому что GUID могут быть громоздкими (с читаемой человеком точки зрения они представляют собой строку шестнадцатеричных чисел, обычно сгруппированных следующим образом: aaaaaaaa-bbbb-cccc-dddd-ffffffffffff), некоторые пространства имен, которым нужны уникальные имена в разных организациях, используют другую схему (часто основанную на доменных именах Интернета).
таким образом, пространство имен для пакетов Java по соглашению начинается с доменного имени orgnaization (reversed), за которым следуют имена, определенные в некоторой организации specfic. Например, пакет Java может быть назван:
это означает, что работа с коллизиями имен становится ответственность каждой организации.
пространства имен XML также уникальны аналогичным образом-по соглашению, кто-то, создающий пространство имен XML, должен сделать его » под » зарегистрированным доменным именем под их контролем. Например:
GUID или UUID (глобально против универсально) уникальный идентификатор, ну, уникальный идентификатор:) когда вам нужно что-то действительно уникальное сгенерированное машиной, есть библиотеки, чтобы получить его.
посмотреть GUID в Википедии для сведения.
Что касается того, когда вам не нужен GUID, это когда счетчик, который вы контролируете (так или иначе, как последовательный тип SQL или последовательность), увеличивается. Индексирование» текстового » значения (GUID в текстовой форме) или 128-битного двоичного значения (который GUID) намного дороже, чем целое число.
кто-то сказал, что они концептуально 128-битные случайные значения, и это по существу верно, но сделав небольшое чтение на UUID (GUID обычно относится к реализации Microsoft UUID), я вижу, что существует несколько разных версий UUID, и большинство из них на самом деле не являются случайными. Таким образом, можно создать UUID для машины (или что-то еще) и иметь возможность надежно повторить этот процесс, чтобы получить тот же UUID по дороге, что важно для некоторых приложения.
для меня легче думать о них как просто «128-битные случайные значения». По сути, так оно и есть. Есть некоторые алгоритмы для включения немного информации в несколько цифр вашего GUID (таким образом, случайная часть становится немного меньше), но все же они довольно большие почти случайные значения.
Я оставлю это вам, чтобы выяснить, где их использовать, но в других ответах уже есть некоторые примеры. Пусть ваше воображение одичал. 🙂
128-битный уникальный идентификатор. Вы можете генерировать GUID отныне до заката, и вы никогда не будете генерировать один и тот же GUID дважды, и никто другой. Они используются много с COM.
как например чего-то вы использовали бы их для, мы используем их в одном из наших продуктов. Наши пользователи могут создавать категории и карты на различных устройствах. Мы хотим убедиться, что мы не путаем категорию, сделанную на одном устройстве, с категорией, созданной на другом, поэтому важно эти идентификаторы уникальны независимо от того, кто их генерирует, где и когда они генерируют. Поэтому мы используем GUID (на самом деле мы используем нашу собственную схему, используя 64-битные числа, но они похожи на GUID).
несколько лет назад я работал над системой ACD call center, где мы хотели собрать подробные записи вызовов из нескольких процессоров вызовов в одну базу данных. Я настраиваю столбец в MS SQL для создания GUID для ключа базы данных, а не с помощью системного последовательного идентификатора (столбец идентификаторов). Тогда это требовало установки значения по умолчанию в NewID (или генерации его в коде, но функция NewID () была более безопасной). Конечно, наличие большого значения для ключа может поднять несколько бровей, но я предпочел бы отказаться от пространства, чем рисковать столкновением.
Я не видел ни одного адреса, использующего GUID в качестве ключа базы данных, поэтому я подумал, что это может помочь узнать, что Вы тоже можете это сделать.
идентификатор GUID-глобальный уникальный идентификатор.
используйте его, когда вы хотите однозначно идентифицировать что-то в глобальном контексте.
GUID означает «глобальный уникальный идентификатор», и вы используете его, когда хотите иметь глобальный уникальный идентификатор.
в RSS-каналах, например, вы должны иметь GUID для каждого элемента в ленте. Таким образом, программа чтения ленты может отслеживать, прочитали ли вы этот элемент или нет. Без GUID было бы невозможно сказать.
вы также увидите термин UUID, который означает » универсальный уникальный идентификатор.- В сущности, между ними нет никакой разницы. UUID-более подходящий термин. GUID-это термин, используемый Microsoft.
Если вам нужно создать идентификатор, который должен быть уникальным в течение всего срока службы вашего приложения, вы используете GUID.
представьте, что у вас есть сервер с сеансами, если вы даете каждому сеансу идентификатор GUID, вы уверены, что он будет уникальным для каждого сеанса, когда-либо созданного вашим сервером. Это полезно для отслеживания ошибок.
одно особенно полезное приложение GUID, которое я нашел, использует их для отслеживания уникальных посетителей в webapps, где посетители анонимны (т. е. не вошли в систему или зарегистрированы).
Guid что это такое
Что такое GUID
Прежде всего, хочу отметить, что всё написанное ниже не претендует на истину в последней инстанции, а является суммой собственного эмпирического опыта и материалов из интернета, в том числе сомнительной достоверности.
«. The Transact-SQL NEWID function and the application API functions and methods generate new uniqueidentifier values from the identification number of their network card plus a unique number from the CPU clock. «
Структура GUID
Структуру GUID Microsoft описывает следующим образом (HOWTO: Use GUIDs w/ Access, SQL 6.5 and SQL 7):
А визуальное представление, которое ещё называется каноническим видом, вот так (BOL):
Налицо явное несоответствие: 4 элемента в определении типа и 5 частей в строке. Это можно понять, если внимательно рассмотреть самую правую часть строки. Она как раз и представляет собой шестибайтовый MAC-адрес сетевой карты. Следующие два байта тоже как-то связаны с оборудованием, и, вполне возможно, способствуют решению проблемы возможного совпадения адресов в некоторых сетевых платах.
Левая половина кода, несмотря на разбиение на три части, может быть интерпретирована как метка времени. В примере (для Access’97) есть функция (найдена в конференции MAUG), которая извлекает из неё момент начала текущего сеанса работы. То, что она делает, выглядит как шаманство, однако для GUID’ов, сгенерированных Access’ом и MSSQL Server’ом, даёт вполне верный результат.
Практическое использование GUID
Теперь о главном: не так важно, как GUID делается. Гораздо важнее оценить возможность его использования в качестве первичного ключа. Совершенно очевидно, что в четыре раза больший размер поля приводит к более быстрому увеличению размеров таблиц. Ещё несколько лет назад это имело существенное значение, но сейчас, когда как дисковая, так и оперативная память значительно подешевела и увеличилась в объёмах, данный фактор можно просто исключить из рассмотрения (но только для клиент-серверных систем!).
Исходя из этого строился тестовый набор из двух таблиц:
Далее выполнялся простейший запрос, суммирующий Value из таблицы Detail по одинаковым значениям Criteria из таблицы Master.
Так вот: применение GUID’ов привело к увеличению времени выполнения запроса почти в 4 раза (с 3 до 11 секунд). Такое снижение производительности делает использование таких идентификаторов в традиционных документоориентированных программах учета, мягко говоря, не очень привлекательным. Кстати, применение текстовых идентификаторов, предложенных в заметке «Уникальные идентификаторы», даёт аналогичный результат.
Результат получился совершенно другой: в обоих случаях запрос выполнялся около двух секунд и разница субъективно не была заметна. Это, скорее всего, позволяет в данном случае не учитывать критерий быстродействия при выборе типа идентификатора.
GUID и Access’97
Всё написанное ниже относится к русской версии с установленным пакетом обновления 2 (SR-2) и типу данных «Числовой» или «Счетчик» с размером поля «код репликации» для таблиц JET. Хотя, присоединённые таблицы MS SQL Server ведут себя аналогично.
Создаётся впечатление, что 97-й Access не был изначально рассчитан на активное использование этого типа данных. Он описывается как массив байтов (vbByte + vbArray), то есть отдельного типа не предусмотрено. Различные варианты получения содержимого элементов управления и полей наборов записей дают самые разнообразные результаты:
ъR^щW5*Ф[ (строка из 16 символов)
. (байтовый массив, который выводится в окне отладки скорее всего как строка Unicode)
Как получить уникальный идентификатор GUID в 1С
1. Что такое GUID в 1С?
GUID – это объект матричной таблицы в системе базы данных из шестнадцатеричных символов, заключенных в круглые скобки и прописанных через дефис. Он формируется с учетом времени и места, указывающего на расположение этого объекта (справочника, документа). Первая половина этого кода является расчетом времени, вторая – местом, где хранится объект. GUID в 1С создается в момент создания объекта. Подобно массивам объект хранится в определенной таблице, на определенном столбце с определенной строкой. При определенном попадании в эти 100 наносекунд могут формироваться абсолютно идентичные объекты. Это настолько мало вероятно, как проверить на уникальность все значения за 10 млрд лет.
Вот так выглядит GUID БД 1С: 3de72ee8-f8b2-11e4-92f1-0050568b35ac
Его UUID можно получить по ссылке.
Это зеркальное отражение уникального идентификатора в 1С 8.3.
Совпадений разных объектов одной базы крайне малы, т.к. общее количество сгенерированных ключей составляет (2128 или 3,402 * 10в38).
Этот 128-битный код информации определяется ссылкой на тип метаданных, содержащий информацию об объекте. Генерация Guid происходит не только в пространстве, но и во времени псевдослучайным набором чисел. Непрерывно сформированные GUIDы используются в качестве первичных ключей в базе данных.
2. Чем отличается GUID от UUID?
UUID – универсально-уникальный идентификатор по данным всемирной организации стандартизации версии RFC4122. Этот термин используется в спецификациях протокола Windows как синоним GUID в 1С. Он должен быть полностью технически совместим с RFC4122. Из рекомендаций Международного стандарта «Все стандарты UUID, соответствующие этой Рекомендации, должны иметь биты варианта с битом 7 октета 7, установленным в 1 и бит 6 октета 7, установленным в 0».
3. Как получить уникальный идентификатор зная UUID в 1С
Итак, как же получить GUID зная UUID в 1С?
В конструкторе запроса необходимо создать запрос:
Для установления соответствия объектов разных БД используется GUID.
Необходимо указать узел обмена и тип объекта (склад, договор, контрагент и т.д.). В «источнике» базы данных нужно указать объект, с которым будет устанавливаться соответствие с объектом из «приемника» БД.
Тип данных GUID в Microsoft SQL Server (UNIQUEIDENTIFIER)
Приветствую Вас на сайте Info-Comp.ru! Сегодня мы с Вами рассмотрим такое понятие, как GUID, Вы узнаете, что это такое, как GUID реализован в Microsoft SQL Server и какие инструменты нам предоставляет язык T-SQL для работы с GUID.
Что такое GUID
GUID – это глобальный уникальный идентификатор.
В Microsoft SQL Server GUID реализован в виде 16-байтового типа данных UNIQUEIDENTIFIER. Значения, которые хранит данный тип данных, глобально уникальны для всех таблиц, баз данных и серверов.
В каких ситуациях нам может пригодиться такой идентификатор? Например, когда у нас есть несколько баз данных, которые хранят схожую информацию, однако все данные должны быть четко идентифицированы, даже в случае объединения всех данных из всех баз данных в один набор. Если мы будем использовать обычные целочисленные идентификаторы, такую уникальность (без дополнительных манипуляций) мы обеспечить не сможем, а вот если использовать GUID, то такая уникальность обеспечена.
Как создать GUID в Microsoft SQL Server
Сгенерировать новое значение GUID и инициализировать столбец или переменную с типом UNIQUEIDENTIFIER в SQL Server можно с помощью функции NEWID. Однако кроме этого можно сформировать GUID путем преобразования строки xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, где каждый x – это шестнадцатеричная цифра (0–9 или A–F).
Инициализируем переменную с типом UNIQUEIDENTIFIER функцией NEWID
В этом примере мы объявляем переменную с типом данных UNIQUEIDENTIFIER, а затем с помощью функции NEWID присваиваем ей значение GUID.
Инициализируем переменную с типом UNIQUEIDENTIFIER путем преобразования строки
В данном случае мы вручную сформировали текстовую строку, т.е. GUID, и присвоили это значение переменной с типом данных UNIQUEIDENTIFIER.
Создаем столбец с типом данных UNIQUEIDENTIFIER
А теперь давайте представим, что нам необходимо, чтобы наши товары, допустим, записи в таблице Goods, имели глобально уникальный идентификатор.
Для этого мы для столбца идентификатора укажем тип данных UNIQUEIDENTIFIER и зададим значение по умолчанию, в нашем случае вызов функции NEWID.
Таким образом, всякий раз, когда новая запись вставляется в таблицу Goods, по умолчанию функция NEWID генерирует уникальное значение для столбца ProductId, т.е. GUID.
При добавлении записей в инструкции INSERT мы просто указываем ключевое слово DEFAULT в качестве значения для первого столбца, который предназначен для идентификатора. В этом случае в этот столбец по умолчанию будет вставлено значение GUID.
Заметка! Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу «SQL код» – это самоучитель по языку SQL для начинающих программистов. В ней очень подробно рассмотрены основные конструкции языка.
На сегодня это все, надеюсь, статья была Вам интересна и полезна, до новых встреч!
В чём разница между UUID и GUID?
Я часто встречаю эти две аббревиатуры, и интересно, в чём же их отличия?
1 ответ 1
Если кратко: разницы нет, они обозначают одно и то же.
(Ниже оригинальный текст ответа)
Рассматривайте их как 16-байтное (128-битное) значение, которое призвано быть уникальным. В Microsoft их называют GUID, в то время как все остальные называют UUID.
И авторы спецификации UUID, и сам Microsoft в настоящее время считают их синонимами:
в RFC 4122 указанно, что UUID «also known as GUIDs (Globally Unique IDentifier)»;
в ITU-T Recommendation X.667, ISO/IEC 9834-8:2004 International Standard: «UUIDs are also known as Globally Unique Identifiers (GUIDs), but this term is not used in this Recommendation»;
и даже Microsoft в своей документации указывает: «The term universally unique identifier (UUID) is sometimes used in Windows protocol specifications as a synonym for GUID».
Однако по-настоящему правильный ответ зависит от того, что именно в вопросе имеется в виду под термином «UUID».
Первая часть зависит от того, о чём спрашивающий думает, когда говорит «UUID».
Из документации Microsoft неявно следует, что все UUID являются корректными GUID. Однако при этом остаётся неочевидным: любой ли GUID является корректным UUID? Другими словами, является ли UUID всего лишь подмножеством GUID, или это одно и то же множество?
В RFC 4122 мы можем обнаружить четыре разных варианта («variants») UUID. Так получилось из-за того, что подобные 16-байтные идентификаторы использовались и до того, как появилась спецификация UUID. В спецификации эти варианты постарались объединить. Согласно разделу 4.1.1, варианты таковы:
вариант 0 ( 0xxx ) — зарезервирован для совместимости с устаревшим Apollo Network Computing System;
вариант 1 ( 10xx ) — основной, который и описан в RFC 4122 (имеет пять подвариантов, называемых «версиями»);
вариант 2 ( 110x ) — зарезервирован для обратной совместимости с системами Microsoft;
вариант 3 ( 111x ) — зарезервирован на будущее.
Согласно RFC 4122 все варианты UUID являются «настоящими UUID», так что все GUID также являются UUID. Если отвечать буквально на вопрос «в чём разница между UUID и GUID», то, согласно RFC, ответ — разницы нет (но с учётом написанного ниже).
Но не все GUID являются UUID варианта 1 (например, Microsoft COM имеет GUID, которые являются UUID варианта 2). Если отвечать на вопрос «есть ли разница между GUID и UUID варианта 1», то ответ был бы да — они могут быть разными. Кто-нибудь, задающий вопрос про UUID и GUID, вероятно, не в курсе о существовании вариантов, и они, говоря «UUID», неявно подразумевают только UUID варианта 1 (например, они что-то слышали про UUID с MAC-адресом+временем и про случайные UUID, которые оба являются версиями варианта 1). В этом случае ответ — да, разница есть.
Так что ответ зависит от того, что имеет в виду спрашивающий, когда говорит «UUID». Имеет ли он в виду UUID варианта 1 или вообще любые UUID?
Вторая часть зависит от того, какая спецификация используется в качестве определения UUID.
Заглянем в ITU-T X.667 ISO/IEC 9834-8:2004, который должен быть полностью совместим с RFC 4122. В пункте 11.2 есть дополнительное предложение, в котором говорится (перевод): «Все UUID, соответствующие настоящей Рекомендации | Международному стандарту, должны иметь variant-биты с битом 7 октета 7, установленным в 1, и битом 6 октета 7, установленным в 0». В переводе на человеческий язык это означает, что только UUID варианта 1 ( 10xx ) соответствует этому стандарту. В таком случае не все GUID соответствуют UUID в понимании ITU-T/ISO/IEC.
Таким образом, реальный ответ зависит и от того, какую именно спецификацию UUID подразумевает вопрос. Если мы говорим о любых UUID, а не только об UUID варианта 1, получается так: нет разницы между GUID и IETF UUID (RFC 4122), однако есть разница между GUID и ITU-T/ISO/IEC UUID!
Кодирование в бинарной форме также может отличаться. При кодировании GUID порядок байтов первых трёх полей может быть изменён. Это отличается от UUID, в котором всегда используется только сетевой порядок байтов (big endian). Если вам нужно кодировать UUID/GUID в бинарную форму, внимательно изучите документацию вашей реализации UUID/GUID по поводу порядка байтов.
Слегка вольный перевод ответа от Hoylen на enSO с дополнениями от сообщества. Нумерация вариантов UUID в RFC не определена, и в этом ответе варианты пронумерованы в соответствии с числом ненулевых бит в обозначении варианта (как в Википедии).
Эффективная генерация сортируемых GUID для первичных ключей БД на клиенте
Использовать Guid.NewGuid() в качестве первичного ключа в базе данных — плохая с точки зрения производительности идея. Это связано с тем, что в SQL Server, MySQL и некоторых других БД для первичных ключей создаются кластерные индексы, которые определяют, как строки будут храниться на диске. GUID — это по сути случайное значение, поэтому новая строка может попасть в начало, середину или конец таблицы. Серверу БД в этом случае придётся перемещать другие строки, что приведёт к фрагментации данных, а их извлечение может занять больше времени, если вам нужно извлечь несколько добавленных последовательно записей (например, когда вы добавляете набор связанных сущностей, которые потом будут извлекаться вместе — БД понадобится прочитать данные из разрозненных страниц вместо последовательного чтения набора данных).
Проблема
Для создания первичных ключей сущности большинство людей прибегают к одному из следующих подходов:
Использование в качестве первичного ключа int и генерация таких ключей базой данных при вставке новой строки.
Использование GUID и опции генерации на уровне БД.
Самостоятельная генерация GUID в своём приложении и вставка строки с этим идентификатором.
Чтобы дать немного контекста и выяснить, почему вам могут понадобиться последовательные GUID, рассмотрим плюсы и минусы каждого из вышеперечисленных подходов к созданию первичных ключей.
Генерируемый БД Integer в качестве идентификатора
Первый вариант, позволяющий базе данных автоматически генерировать целочисленный первичный ключ, является очень заманчивым подходом; долгое время, особенно в монолитных системах, это было подходом по умолчанию, который удобно интегрировался с ORM. Одна из его приятных особенностей — первичные ключи получают красивые, монотонно возрастающие (и обычно последовательные) идентификаторы.
Это упрощает работу с тестовыми данными и поддержку, когда идентификаторы используюстя в URL-адресах: можно запомнить ID нужной сущности, быстро получить её в коде или по адресу, вбив нужный идентификатор:
Какие недостатки у таких ключей?
Во-первых, подход с генерацией ключей в базе данных затрудняет или делает невозможным использование некоторых паттернов проектирования. Например, общий подход к идемпотентности заключается в создании идентификатора на клиенте и отправке его в запросе. Это позволяет легко устранять дублирование и гарантирует, что вы не вставите один и тот же объект дважды, так как легко обнаружить повторяющиеся запросы на вставку. Такой подход обычно невозможен с идентификаторами, сгенерированными базой данных.
Во-вторых, это усложняет код INSERT, поскольку вы должны убедиться, что возвращаете сгенерированные идентификаторы. EntityFramework под капотом назначает ID сущностям после вставки, но в случае с Dapper вам придётся делать это самим.
Третья проблема возникает только в высоконагруженных приложениях — при вставке большого количества строк БД должна блокировать генератор идентификаторов чтобы избежать использования одного ID несколькими сущностями, это может стать узким местом в приложении. Если БД масштабируется и используется master-master репликация, то всё становится ещё сложнее — в разных БД существуют разные настройки, которые могут генерировать записи с пропусками (например, первый сервер будет генерировать только нечетные идентификаторы, а второй только четные) или генерировать идентификаторы из разных подмножеств.
Резимуруя этот подход:
Читаемые и запоминаемые URL.
Проблемы с идемпотентностью.
В некоторых случаях нужно дополнительно озаботиться возвращением идентификаторов при вставке.
Снижение производительности в высококонкурентной среде.
Генерируемый БД GUID в качестве идентификатора
При использовании сгенерированных БД гуидов мы можем избавиться от части проблем — например, NEWSEQUENTIALID() использует для генерации значений данные оборудования (MAC-адрес сетевой карты и «идентификатор часов»), поэтому сгенерированный с помощью неё иденитфикатор остается глобально уникальным. Это избавляет от необходимости дополнительной настройки генерации последовательности иденификаторов при репликации.
Функция генерирует корректно сортируемые последовательности, так что данные будут вставляться последовательно, а при слиянии данных с нескольких реплик эти данные так же будут локально последовательными.
В MySQL функция UUID() генерирует UUID версии 1, что делает их так же частично сортируемыми.
Стоит сразу заметить, что в PostgreSQL данные хранятся иначе, поэтому использование непоследовательных GUID не влияет катастрофически на производительность базы данных.
В случае генерируемых БД идентификаторов мы всё ещё вынуждены мириться с сложностью реализации идемпотентности в запросах и необходимостью заботиться о возвращении идентификаторов при вставке. Также тот факт, что гуиды являются 128-битными значениями по сравнению с 32-битными целыми числами, приводит к увеличению общего размера данных.
Генерируемый клиентом GUID в качестве идентификатора
Решение проблем генеририуемых БД первичных ключей заключается в использовании созданных клиентом идентификаторов. У этого подхода тоже есть различные плюсы и минусы!
Вы можете установить это значение в качестве ID для добавляемой сущности, и вам не нужно беспокоиться о проверке, с каким идентификатором она была добавлена в БД. Используете ли вы EF Core или Dapper, Postgres или SqlServer, код будет одинаковым. Данные при запросе на вставку перемещаются только в одном направлении, от клиента к базе данных, а не в двух направлениях, как в случае с генерируемым БД первичным ключом.
Если вы создаете идентификаторы в своем клиентском коде, у вас теперь есть доступ к различным шаблонам идемпотентности. Например, представьте, что вы включаете GUID в запрос, но запрос завершается сбоем из-за ошибки сервера. Вы можете просто отправить тот же запрос еще раз, зная, что сервер сможет идентифицировать его как «дубликат», поэтому ему нужно только повторить часть действия, которое привело к ошибке или просто вернуть ответ об успешном создании сущности. Таким образом, вы можете избежать создания дубликатов.
Если подводить итог для опции генерируемого на клиенте GUID, то получится следующее:
Легко использовать и код остаётся универсальным при переходе между разными БД.
Позволяет сделать запросы идемпотентными без дополнительного уровня абстракции.
Нет необходимости читать значения из БД после вставки.
Больший объем данных по сравнению с целочисленными идентификаторами.
Могут вызвать проблемы с производительностью БД из-за фрегментации индекса.
Преимущества сортируемого GUID
У гуидов есть несколько преимуществ, и, кроме проблем с человекочитаемостью, один большой недостаток с фрагментацией индекса, вызванной их полной случайностью. А нам всего-то и нужен сортируемый последовательно-возрастающий глобально-уникальный идентификатор чтобы использовать его в качестве ключа. Где его взять?
Самый простой ответ — нам нужен тот самый UUID версии 1, который используется функциями БД для генерации идентификаторов. Но есть несколько проблем. В BCL нет полной реализации RFC 4211, и, судя по комментариям в github дотнета, такую поддержку прямо сейчас добавлять не планируется. Если поискать по nuget-пакетам, то какого-то одного стандарта де-факто, который бы активно использовался и поддерживался сообществом тоже нет. Я нашёл библиотеку Vlingo.Xoom.UUID, которая завляет поддержку RFC 4211. Ещё один способ из хабростатьи про GUID в качестве первичных ключей предлагает использовать DllImport к библиотеке, которая используется SQL Server для генерации идентификаторов — такой способ вызовет очевидную проблему с переносимостью.
Но у UUID версии 1 на мой взгляд есть недостатки на уровне самого стандарта. Во-первых, для метки времени используется количество 100-наносекундных интервалов, прошедших с 15 октября 1582 года. Это совсем не то, как мы привыкли думать о timestamp в нашем повседневном программировнии. Во-вторых, в случае с UUID версии 1 метка времени внутри идентификатора частично перевернута, то есть старшие биты таймстампа сдвинуты к младшим битам в самом UUID. Это объясняет тот факт, что в примере с NEWSEQUENTIALID() менялись именно старшие разряды идентификатора. Такой порядок делает лексикографическое упорядочивание немного бессмысленным.
Мы могли бы просто переставить биты внутри UUID и вернуть время и упорядоченность к изначальному виду от старших бит к младшим, но это дополнительное усложение, которое всё ещё предполагает использовать непривычный timestamp совсеместно с дополнительной логикой защиты от коллизий (в случае, если в 100нс интервал генерируется несколько идентификаторов). Хочется чего-то более нативного.
Отличные новости — для решения этой задачи 31 марта 2022 года на сайте IETF был официально размещен текст рабочего документа с новыми форматами UUID, специально предназначенными для использования в высоконагруженных приложениях и базах данных — возрастающие по времени, создержащие timestamp, счетчик с инициализацией его сегментов нулем и псевдослучайным значением, а также собственно псевдослучайное значение. Стандарт ещё не принят, но уже сейчас можно найти первые реализации библиотек для UUID версии 7.
Ещё одна хорошая новость — есть библиотека NewId, которая позволяет генерировать лексикографически упорядоченные по времени создания идентификаторы и тоже создана как раз для первичных идентификаторов. Сама библиотека основана на Snowflake_ID, который разработан специально для использования в распределенных системах, и Flake, который развивает идеи UUID версии 1. Самый простой способ понять, что это значит, — показать, как выглядят идентификаторы, сгенерированные NewId.
Пример результата работы программы:
NewId использует в качестве данных для создания идентификатора 3 источника:
Worker/process ID, который отвечает за уникальность между процессами/сервером — именно он отвечает за общую для всех идентификаторов часть, а идентификатор конкретного процесса можно включить дополнительно для избежания коллизий между процессами в рамках одной машины.
Timestamp, который обеспечивает сортируемость идентификатора.
Последовательно возрастающий идентификатор.
Объединив 3 части вместе, вы можете получить идентификатор, который будет частично отсортированным благодаря компоненту метки времени. Включив идентификатор процесса, можно избежать коллизий при генерации идентификаторов несколькими процессами. А использование части с последовательно возрастающим идентификатором позволяет генерировать 2^16-1 идентификаторов в миллисекунду в рамках одного процесса:
Иллюстрация «Flake» ID из поста об этом идентификаторе. NewId основан на том же подходе.
На сколько же NewId снижает фрагментацию индекса?
Сравнение фрагментации индекса при использовании разных генераторов UUID
В сравнительном эксперементе я решил сравнить степень фрагментации и плотность данных от несколько генераторов UUID в качестве первичных ключей:
[DllImport(«rpcrt4.dll», SetLastError = true)]
Vlingo.UUID.TimeBasedGenerator.GenerateGuid c опцией GuidGenerationMode.WithUniquenessGuarantee
В тесте для простой таблицы с идентификатором и текстовым полем будет добавляться 10 тысяч записей, каждая с случайной задержкой 100-500 миллисекунд, таким образом в идентификаторе будут участвовать таймштампы за 50 минут одного дня.
NewId, по-видимому, в значительной степени ориентирован на сервер SQL Server. Поэтому, и потому, что для MySQL я не нашёл понятного способа измерить фрагментацию данных и эффективность использования дискового пространства, тесты проводились именно на SQL Server.
Развернем Docker-образ SQL Server:
Создадим 5 простых таблиц для разных типов сгенерированных идентификаторов:
Создадим в таблицах тестовые данные при помощи старого-доброго ADO.NET:
Чтобы посмотреть размер каждого индекса и его фрагментацию, используем стащенный из этой статьи запрос:
Полученные данные легко объяснить из информации, которую мы уже знаем. Во-первых, сгенерированные случайно идентификаторы приводят к большой фрагментации данных поскольку новые элементы вставляются на случайную позицию. NewId вызвали только 5-процентную фрагментацию, а Vlingo.UUID всего 3-процентную фрагментацию. Ещё при использовании Guid остается больше пустого места на каждый странице с данными (возможно, из-за постоянных перемещений данных во время вставки), поэтому вам нужно больше страниц для хранения того же объема данных (81 против 59). Это тоже станет источником некоторого снижения производительности при использовании гуидов. Что касается UUID версии 7, то остается только думать, что способ, которым SQL Server сортирует ключи не совсем совместим с новым форматом.
Но на самом деле влияние фрагментации при чтении данных совсем не так велико, как может представляться — скорее можно назвать его незначительным. Вот пример замера производительности при чтении 10.000 записей и 100.000 записей в запросе:
Настоящая проблема c производительностью гуидов начинается в больших таблицах при вставке данных — потому что индекс перестраивается случайным образом, а сервер БД не может сделать предсказания для следующего набора данных. Один из бенчмарков сравнивает производительность добавления 5 миллионов записей батч-запросами по 100.000 записей каждая в таблицу c автоинкрементным целым ключом, UUID версии 1, 4 или подхаченной «последовательной» версии 4 после манипуляции с битами. По результатам видно, что после полутора миллионов записей UUID версии 4 начинает деградировать, а время вставки быстро растет:
Выводы
Библиотеки NewId и Vlingo.UUID явно делают свою работу. Первая создана и развивается специально для решения проблемы с первичными ключами в базах данных, где данные строк хранятся в кластерных индексах. Вторая — утилитарный пакет платформы XOOM компании Vlingo и не имеет даже публичной документации.
Стоит ли его использовать? Ответ, как обычно — «зависит». Но это точно хорошая альтернатива, если вам нужно генерировать первичные ключи на клиенте и работать с MySQL или MS SQL Server.
Guid Структура
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет глобальный уникальный идентификатор (GUID).
Примеры
В следующем примере класс используется System.Runtime.InteropServices.GuidAttribute для назначения GUID интерфейсу и определяемого пользователем класса. Он извлекает значение GUID путем вызова GetCustomAttribute метода и сравнивает его с двумя другими идентификаторами GUID, чтобы определить, равны ли они.
Обратите внимание, что GuidAttribute атрибут обычно используется в приложении для предоставления типа COM. При компиляции этого примера можно запустить средство регистрации сборок (Regasm.exe) в созданной сборке, чтобы создать файлы реестра (REG) и библиотеки типов (TLB). REG-файл можно использовать для регистрации coclass в реестре, а TLB-файл может предоставлять метаданные для COM-взаимодействия.
Комментарии
GUID — это 128-разрядное целое число (16 байт), которое можно использовать во всех компьютерах и сетях, где требуется уникальный идентификатор. Такой идентификатор имеет очень низкую вероятность дублирования.
Конструкторы
Инициализирует новый экземпляр структуры Guid с использованием указанного массива байтов.
Инициализирует новый экземпляр структуры Guid с использованием заданных целых чисел и байтов.
Инициализирует новый экземпляр структуры Guid с использованием заданных целых чисел и массива байтов.
Инициализирует новый экземпляр структуры Guid с использованием значения, представленного заданным диапазоном байтов только для чтения.
Инициализирует новый экземпляр структуры Guid с использованием значения, представленного заданной строкой.
Инициализирует новый экземпляр структуры Guid с использованием указанных целых чисел без знака и байтов.
Доступный только для чтения экземпляр структуры Guid, значение которой состоит только из нулей.
Методы
Сравнивает этот экземпляр с заданным объектом Guid и возвращает значение, указывающее, как соотносятся значения этих объектов.
Сравнивает этот экземпляр с заданным объектом и возвращает значение, указывающее, как соотносятся значения этих объектов.
Возвращает значение, позволяющее определить, представляют ли этот экземпляр и заданный объект Guid одно и то же значение.
Возвращает значение, показывающее, равен ли экземпляр указанному объекту.
Возвращает хэш-код данного экземпляра.
Инициализирует новый экземпляр структуры Guid.
Преобразует диапазон символов только для чтения, представляющий GUID, в эквивалентную структуру Guid.
Анализирует диапазон символов в значение.
Преобразовывает строковое представление объекта GUID в эквивалентную структуру Guid.
Анализирует строку в значение.
Преобразует диапазон символов, представляющих GUID, в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Преобразует строковое представление GUID в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Возвращает массив байтов из 16 элементов, содержащий значение данного экземпляра.
Возвращает строковое представление значения этого экземпляра в формате реестра.
Возвращает строковое представление значения этого экземпляра Guid в соответствии с заданным описателем формата.
Возвращает строковое представление значения этого экземпляра класса Guid в соответствии с заданным описателем формата и сведениями об особенностях форматирования, связанных с языком и региональными параметрами.
Пытается отформатировать текущий экземпляр GUID в указанный диапазон символов.
Преобразует указанный диапазон символов только для чтения, содержащий представление GUID, в эквивалентную структуру Guid.
Пытается проанализировать диапазон символов в значение.
Преобразовывает строковое представление объекта GUID в эквивалентную структуру Guid.
Пытается проанализировать строку в значение.
Преобразует диапазон символов, представляющий GUID, в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Преобразует строковое представление GUID в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Пытается записать текущий экземпляр GUID в диапазон байтов.
Операторы
Указывает, равны ли значения двух указанных объектов Guid.
Сравнивает два значения, чтобы определить, какой из них больше.
Сравнивает два значения, чтобы определить, какое значение больше или равно.
Указывает, верно ли, что значения двух указанных объектов Guid не равны.
Сравнивает два значения, чтобы определить, что меньше.
Сравнивает два значения, чтобы определить, что меньше или равно.
Явные реализации интерфейса
Сравнивает этот экземпляр с заданным объектом Guid и возвращает значение, указывающее, как соотносятся значения этих объектов.
Возвращает строковое представление значения этого экземпляра в соответствии с заданным описателем формата и сведениями об особенностях форматирования, связанных с языком и региональными параметрами.
Пытается отформатировать значение текущего экземпляра в указанный диапазон символов.
Guid Структура
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет глобальный уникальный идентификатор (GUID).
Примеры
В следующем примере класс используется System.Runtime.InteropServices.GuidAttribute для назначения GUID интерфейсу и определяемого пользователем класса. Он извлекает значение GUID путем вызова GetCustomAttribute метода и сравнивает его с двумя другими идентификаторами GUID, чтобы определить, равны ли они.
Обратите внимание, что GuidAttribute атрибут обычно используется в приложении для предоставления типа COM. При компиляции этого примера можно запустить средство регистрации сборок (Regasm.exe) в созданной сборке, чтобы создать файлы реестра (REG) и библиотеки типов (TLB). REG-файл можно использовать для регистрации coclass в реестре, а TLB-файл может предоставлять метаданные для COM-взаимодействия.
Комментарии
GUID — это 128-разрядное целое число (16 байт), которое можно использовать во всех компьютерах и сетях, где требуется уникальный идентификатор. Такой идентификатор имеет очень низкую вероятность дублирования.
Конструкторы
Инициализирует новый экземпляр структуры Guid с использованием указанного массива байтов.
Инициализирует новый экземпляр структуры Guid с использованием заданных целых чисел и байтов.
Инициализирует новый экземпляр структуры Guid с использованием заданных целых чисел и массива байтов.
Инициализирует новый экземпляр структуры Guid с использованием значения, представленного заданным диапазоном байтов только для чтения.
Инициализирует новый экземпляр структуры Guid с использованием значения, представленного заданной строкой.
Инициализирует новый экземпляр структуры Guid с использованием указанных целых чисел без знака и байтов.
Доступный только для чтения экземпляр структуры Guid, значение которой состоит только из нулей.
Методы
Сравнивает этот экземпляр с заданным объектом Guid и возвращает значение, указывающее, как соотносятся значения этих объектов.
Сравнивает этот экземпляр с заданным объектом и возвращает значение, указывающее, как соотносятся значения этих объектов.
Возвращает значение, позволяющее определить, представляют ли этот экземпляр и заданный объект Guid одно и то же значение.
Возвращает значение, показывающее, равен ли экземпляр указанному объекту.
Возвращает хэш-код данного экземпляра.
Инициализирует новый экземпляр структуры Guid.
Преобразует диапазон символов только для чтения, представляющий GUID, в эквивалентную структуру Guid.
Анализирует диапазон символов в значение.
Преобразовывает строковое представление объекта GUID в эквивалентную структуру Guid.
Анализирует строку в значение.
Преобразует диапазон символов, представляющих GUID, в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Преобразует строковое представление GUID в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Возвращает массив байтов из 16 элементов, содержащий значение данного экземпляра.
Возвращает строковое представление значения этого экземпляра в формате реестра.
Возвращает строковое представление значения этого экземпляра Guid в соответствии с заданным описателем формата.
Возвращает строковое представление значения этого экземпляра класса Guid в соответствии с заданным описателем формата и сведениями об особенностях форматирования, связанных с языком и региональными параметрами.
Пытается отформатировать текущий экземпляр GUID в указанный диапазон символов.
Преобразует указанный диапазон символов только для чтения, содержащий представление GUID, в эквивалентную структуру Guid.
Пытается проанализировать диапазон символов в значение.
Преобразовывает строковое представление объекта GUID в эквивалентную структуру Guid.
Пытается проанализировать строку в значение.
Преобразует диапазон символов, представляющий GUID, в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Преобразует строковое представление GUID в эквивалентную структуру Guid, при условии, что строка имеет указанный формат.
Пытается записать текущий экземпляр GUID в диапазон байтов.
Операторы
Указывает, равны ли значения двух указанных объектов Guid.
Сравнивает два значения, чтобы определить, какой из них больше.
Сравнивает два значения, чтобы определить, какое значение больше или равно.
Указывает, верно ли, что значения двух указанных объектов Guid не равны.
Сравнивает два значения, чтобы определить, что меньше.
Сравнивает два значения, чтобы определить, что меньше или равно.
Явные реализации интерфейса
Сравнивает этот экземпляр с заданным объектом Guid и возвращает значение, указывающее, как соотносятся значения этих объектов.
Возвращает строковое представление значения этого экземпляра в соответствии с заданным описателем формата и сведениями об особенностях форматирования, связанных с языком и региональными параметрами.
Пытается отформатировать значение текущего экземпляра в указанный диапазон символов.