что такое uuid товара
Что такое uuid товара
UUID (Universally Unique Identifier) — это стандарт идентификации, используемый в создании программного обеспечения, стандартизированный Open Software Foundation (OSF) как часть Распределённого компьютерного окружения (DCE). Основное назначение UUID — это позволить распределённым системам уникально идентифицировать информацию без центра координации. Таким образом, любой может создать UUID и использовать его для идентификации чего-либо с приемлемым уровнем уверенности, что данный идентификатор непреднамеренно никогда не будет использован для чего-то ещё. Поэтому информация, помеченная с помощью UUID, может быть помещена позже в общую базу данных, без необходимости разрешения конфликта имен. Наиболее распространённым использованием данного стандарта является Globally Unique Identifier (GUID) фирмы Microsoft. Другими значительными пользователями являются Linux (файловая система ext2/ext3, LUKS шифрованные разделы, GNOME, KDE) и Mac OS X — все они применяют реализацию, полученную из библиотеки uuid, находящейся в пакете e2fsprogs.
UUID представляет собой 16-байтный (128-битный) номер. В шестнадцатеричной системе счисления UUID выглядит как:
UUID задокументирован как часть ISO/IEC 11578:1996 «Information technology — Open Systems Interconnection — Remote Procedure Call (RPC)» и позже в ITU-T Rec. X.667 | ISO/IEC 9834-8:2005. IETF опубликовала предлагаемый стандарт RFC 4122, который технически идентичен ITU-T Rec. X.667 | ISO/IEC 9834-8.
UUID версии 7, или как не потеряться во времени при создании идентификатора
В течение многих лет я противостоял засилью UUID как ключей в базах данных, но со временем и практикой до меня дошло. Они действительно удобны, когда речь идёт о распределённых системах. Генерировать новый идентификатор на разных концах планеты не так-то просто. Создание псевдослучайных идентификаторов решает эту проблему.
Хотя, подобные решения, не всегда хороши. В отличие от обыкновенных цифровых значений, которые легко кешировать и сортировать, UUID не так гибки в использовании. UUID версии 7 предназначен как раз для того, чтобы разобраться с подобными проблемами.
Добро пожаловать в мир отсортированных случайностей.
Сами по себе UUID это не просто набор случайных битов. Существует несколько вариантов их генерации. @AloneCoder в своей статье как генерируются UUID в подробностях описывает уже существующие форматы идентификаторов, версии с первой по пятую.
UUID в базах данных
Почему нам необходимо генерировать UUID, а не просто брать случайные данные? Ну, ответов может быть множество. Сохранение данных о хосте, который сгенерировал последовательность, сохранение времени и тому подобных значений, позволяет сделать UUID более информативными. Подобный подход можно использовать при создании распределённых вычислительных систем. Например, вместо того, чтобы грузить базу данных запросами с датой, можно просто выбрать те идентификаторы, которые содержат в себе эту дату.
Всё бы хорошо, но вот именно это и не очень-то просто. Выбирать даты из строковых значений UUID это та ещё свистопляска. Почему? Ну, давайте посмотрим на последовательность генерации UUIDv1.
Берутся младшие 32 бита текущей временной метки UTC. Это будут первые 4 байта (8 шестнадцатеричных символов) UUID [ TimeLow ].
Берутся средние 16 битов текущей временной метки UTC. Это будут следующие 2 байта (4 шестнадцатеричных символа) [ TimeMid ].
Следующие 2 байта (4 шестнадцатеричных символа) конкатенируют 4 бита версии UUID с оставшимися 12 старшими битами текущей временной метки UTC (в которой всего 60 битов) [ TimeHighAndVersion ].
Как всё замечательно запутано. На самом деле, распарсить дату из такого идентификатора достаточно просто, но парсинг это парсинг. Это не весело и нагружает процессор.
Герой дня
Основная разработка ведётся силами двух разработчиков: bradleypeabody и kyzer-davis. Хабрачеловеки и хабраалиены могут поучаствовать в обсуждении и написании формата на гитхабе https://github.com/uuid6/uuid6-ietf-draft/.
Пять дней назад эта спецификация вызвала оживлённую дискуссию на hackernews.
При разработке спецификаций, были рассмотрены следующие форматы генерации UUID:
И так, что же такого особого в UUIDv7 и чем он отличается от предыдущих версий?
Эта версия идентификатора бинарно-сортируемая. То есть, вам больше не нужно конвертировать значения UUID в какой-либо другой формат, чтобы понять какое из них больше и меньше.
Ну а нам-то какая разница? Можно же сделать select id, creation_date order by creation_date и жить себе спокойно.
Вы не поняли вопроса.
Тут дело не в том, как вам, программисту, удобнее делать SELECT. Вопрос в том, как база данных хранит индексы. Созданные последовательно, UUIDv4 будут выглядеть случайными. Соответственно, при записи значений этих индексов в базу данных, даже если значения были созданы в один и тот же промежуток времени, кластеризация будет нагружать индексы при записи.
Представьте, у вас есть высоконагруженная система. 100 серверов генерируют новые записи с UUID несколько раз в секунду, и всё это летит в Redis, которые грузит эти данные в Postgresql.
Ага. Вот тут вот жизнь с UUIDv7 становится проще. Значения индексов не настолько разбросаны и следить за ними намного проще.
Плюс, значения ключей можно очень просто и быстро отсортировать в бинарном формате. Возьмите первые 64 бита идентификатора, и сравните их как int64 с другим идентификатором, и вы уже знаете, какой был создан раньше.
Но, как же это работает?
Ок, в отношении самой даты — тут всё просто. Запишите число, как unix timestamp и у вас есть что-то бинарно-сортируемое. Только я вас прошу, не стоит записывать эту дату кусками, в разнобой. Просто и понятно, первые 36 битов содержат в себе одно число. Но, если вы пытаетесь записать миллисекунды, то всё становится сложнее.
Давайте поговорим о математике. О приближении и лимитах. Любимая тема, а? Давайте посмотрим на следующую запись секунды: 05,625. Пять целых, шестьсот двадцать пять секунд. Отбрасываем 5, поскольку это будет записано в unix timestamp.
Если вы будете сохранять это значение в float, то выглядеть это будет страшно, с бинарной точки зрения. А если мы применим немного матана? Для начала разложим единицу в следующий ряд.
Достаточно, просто, правда? Если сложить все числа в этом ряду, то вы получите единицу. А что если складывать не каждый? Ну, с этим можно что-то сделать. Давайте присвоим каждому числу из этого ряда один бит. Каждый бит будет показывать, если этот член присутствует в ряду или нет.
Берём нашу суб-секундную точность, 0,625 и начинаем записывать эту точность с помощью битов.
Первое число 1/2, то есть 0,5. Если наше значение точности больше этого числа, то выставляем битовое значение в 1 и вычитаем это число из нашего текущего значения точности. В итоге получаем, битовую последовательность 1 и 0,125 в остатке.
Что самое приятное, в этой системе, так это то, что если вы урезаете количество бит с конца, то вы будете терять точность, но всё-же сохраните более или менее приближенное значение.
Значение сохраняется, и при этом, вы можете играть с количеством битов, которые вы расходуете на его запись. И — что самое главное — подобная запись производит бинарно-сортируемые значения.
Более того, существует очень простой математический способ выполнения этой операции. Для того чтобы закодировать любое число, сделайте следующее:
Ну и, понятное дело, для того, чтобы раскодировать, нужно сделать обратное.
Что мы получаем в итоге? Возможность сохранения времени с суб-секундной точностью в бинарно-сортируемом формате.
А в случае коллизий?
Если вы генерируете значения на одном узле, то существует вероятность, что даже при наличии суб-секундной точности вы можете создать два идентификатора в один промежуток времени.
Для этого стандарт предусматривает наличие счётчика произвольной длинны, который должен монотонно увеличиваться, если даты совпадают.
И в дополнение, можно задать произвольное количество битов, которые будут идентифицировать компьютер, сгенерировавший значение. (Записывать MAC адрес в это поле не стоит, ибо уж слишком часто это вызывало вопросы с точки зрения безопасности).
Плюс, всё пространство, которое не используется для времени, счётчика и номера компьютера (порядка 54х бит) необходимо заполнять случайными значениями для предотвращения каких-либо совпадений на разных узлах.
Простыми словами: 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») и гиперссылки на источник заимствования. Без письменного разрешения правообладателя не допускается копирование и последующее распространение размещенных на сайте материалов в полном объеме.
Обновление товаров выгрузкой через UUID
Чтобы система управления Вашим сайтом и конфигурация 1С, в которой ведется учет, однозначно идентифицировали один и тот же товар, мы вывели в параметрах товаров поля «UUID Товара» и «UUID Основной модификации».
Теперь, зайдя в редактор магазина и кликнув по любому названию товара (или по иконке «Изменить» в строке любого товара) Вы сможете их увидеть:
Шаг 1
Для корректной связи товаров в системе управления и в 1С Вам следует для всех товаров и модификаций заполнить соответствующие поля.
Для наглядности разберем, что именно является «UUID Товара», а что «UUID Основной модификации»:
Если в 1С у Вас ведется учет определенного товара в разрезе характеристик, то в файле offers.xml идентификатор товара выглядит так:
Шаг 2
После установки всех UUID для всех товаров, Вы можете попробовать провести импорт данных из 1С.
Внимание! Непосредственно перед импортом настоятельно рекомендуем обратиться в нашу компанию для создания резервной копии Вашего сайта.
Импорт товаров из 1С Вы можете проводить по инструкции: http://help.megagroup.ru/import-1s
Если Вам требуется обновлять только цену и количество у уже созданных на сайте товаров, не трогая прочих данных, используйте режим импорта «Обновлять только цены и количество».
Если на стороне 1С у Вас появляются новые товары, которые необходимо добавить на сайт, рекомендуем использовать режим импорта «Добавлять новые, не изменять существующие». При выборе такого режима параметры добавленных ранее товаров (такие как иллюстрации, описание и пр.) не затрутся, если в 1С и на сайте они не совпадают (по ключевому полю).
Обращаем Ваше внимание!
Описанный выше алгоритм применим только для товаров с модификациями, когда учет товаров в 1С идет в разрезе характеристик.
Если в 1С характеристик нет, то UID будет коротким, например: 24d57f6a-df6a-11e4-8038-9c8e99f31b78 тогда модификаций у товара не будет и в оба поля «UUID Товара» и «UUID Основной модификации» нужно будет вводить одно и тоже: 24d57f6a-df6a-11e4-8038-9c8e99f31b78.
Если поля «UUID Товара» и «UUID Основной модификации» заполнены не будут, то не получится обновить данные товары с помощью выгрузки из 1С, таким образом, будет создан полный аналог существующего товара. Обновляться через 1С будет тоже именно этот новый товар.
Как генерируются UUID
Вы наверняка уже использовали в своих проектах UUID и полагали, что они уникальны. Давайте рассмотрим основные аспекты реализации и разберёмся, почему UUID практически уникальны, поскольку существует мизерная возможность возникновения одинаковых значений.
Современную реализацию UUID можно проследить до RFC 4122, в котором описано пять разных подходов к генерированию этих идентификаторов. Мы рассмотрим каждый из них и пройдёмся по реализации версии 1 и версии 4.
Теория
UUID (universally unique IDentifier) — это 128-битное число, которое в разработке ПО используется в качестве уникального идентификатора элементов. Его классическое текстовое представление является серией из 32 шестнадцатеричных символов, разделённых дефисами на пять групп по схеме 8-4-4-4-12.
Информация о реализации UUID встроена в эту, казалось бы, случайную последовательность символов:
Значения на позициях M и N определяют соответственно версию и вариант UUID.
Версия
Номер версии определяется четырьмя старшими битами на позиции М. На сегодняшний день существуют такие версии:
Вариант
Это поле определяет шаблон информации, встроенной в UUID. Интерпретация всех остальных битов в UUID зависит от значения варианта.
Мы определяем его по первым 1-3 старшим битам на позиции N.
1 0 0 0 = 8
1 0 0 1 = 9
1 0 1 0 = A
1 0 1 1 = B
Так что если вы видите UUID с такими значениями на позиции N, то это идентификатор в варианте 1.
Версия 1 (время + уникальный или случайный идентификатор хоста)
В этом случае UUID генерируется так: к текущему времени добавляется какое-то идентифицирующее свойство устройства, которое генерирует UUID, чаще всего это MAC-адрес (также известный как ID узла).
Идентификатор получают с помощью конкатенации 48-битного МАС-адреса, 60-битной временной метки, 14-битной «уникализированной» тактовой последовательности, а также 6 битов, зарезервированных под версию и вариант UUID.
Тактовая последовательность — это просто значение, инкрементируемое при каждом изменении часов.
Временная метка, которая используется в этой версии, представляет собой количество 100-наносекундных интервалов с 15 октября 1582 года — даты возникновения григорианского календаря.
Возможно, вы знакомы с принятым в Unix-системах исчислением времени с начала эпохи. Это просто другая разновидность Нулевого дня. В сети есть сервисы, которые помогут вам преобразовать одно временное представление в другое, так что не будем на этом останавливаться.
Хотя эта реализация выглядит достаточно простой и надёжной, однако использование MAC-адреса машины, на которой генерируется идентификатор, не позволяет считать этот метод универсальным. Особенно, когда главным критерием является безопасность. Поэтому в некоторых реализациях вместо идентификатора узла используется 6 случайных байтов, взятых из криптографически защищённого генератора случайных чисел.
Сборка UUID версии 1 происходит так:
Поскольку эта реализация зависит от часов, нам нужно обрабатывать пограничные ситуации. Во-первых, для минимизации коррелирования между системами по умолчанию тактовая последовательность берётся как случайное число — так делается лишь один раз за весь жизненный цикл системы. Это даёт нам дополнительное преимущество: поддержку идентификаторов узлов, которые можно переносить между системами, поскольку начальное значение тактовой последовательности совершенно не зависит от идентификатора узла.
Помните, что главная цель использования тактовой последовательности — внести долю случайности в наше уравнение. Биты тактовой последовательности помогают расширить временную метку и учитывать ситуации, когда несколько UUID генерируются ещё до того, как изменяются процессорные часы. Так мы избегаем создания одинаковых идентификаторов, когда часы переводятся назад (устройство выключено) или меняется идентификатор узла. Если часы переведены назад, или могли быть переведены назад (например, пока система была отключена), и UUID-генератор не может убедиться, что идентификаторы сгенерированы с более поздними временными метками по сравнению с заданным значением часов, тогда нужно изменить тактовую последовательность. Если нам известно её предыдущее значение, его можно просто увеличить; в противном случае его нужно задать случайным образом или с помощью высококачественного ГПСЧ.
Версия 2 (безопасность распределённой вычислительной среды)
Главное отличие этой версии от предыдущей в том, что вместо «случайности» в виде младших битов тактовой последовательности здесь используется идентификатор, характерный для системы. Часто это просто идентификатор текущего пользователя. Версия 2 используется реже, она очень мало отличается от версии 1, так что идём дальше.
Версия 3 (имя + MD5-хэш)
Если нужны уникальные идентификаторы для информации, связанной с именами или наименованием, то для этого обычно используют UUID версии 3 или версии 5.
Они кодируют любые «именуемые» сущности (сайты, DNS, простой текст и т.д.) в UUID-значение. Самое важное — для одного и того же namespace или текста будет сгенерирован такой же UUID.
Обратите внимание, что namespace сам по себе является UUID.
В этой реализации UUID namespace преобразуется в строку байтов, конкатенированных с входным именем, затем хэшируется с помощью MD5, и получается 128 битов для UUID. Затем мы переписываем некоторые биты, чтобы точно воспроизвести информацию о версии и варианте, а остальное оставляем нетронутым.
Важно понимать, что ни namespace, ни входное имя не могут быть вычислены на основе UUID. Это необратимая операция. Единственное исключение — брутфорс, когда одно из значений (namespace или текст) уже известно атакующему.
При одних и тех же входных данных генерируемые UUID версий 3 и 5 будут детерминированными.
Версия 4 (ГПСЧ)
Самая простая реализация.
6 битов зарезервированы под версию и вариант, остаётся ещё 122 бита. В этой версии просто генерируется 128 случайных битов, а потом 6 из них заменяется данными о версии и варианте.
Такие UUID полностью зависят от качества ГПСЧ (генератора псевдослучайных чисел). Если его алгоритм слишком прост, или ему не хватает начальных значений, то вероятность повторения идентификаторов возрастает.
В современных языках чаще всего используются UUID версии 4.
Её реализация достаточно простая:
Версия 5 (имя + SHA-1-хэш)
Единственное отличие от версии 3 в том, что мы используем алгоритм хэширования SHA-1 вместо MD5. Эта версия предпочтительнее третьей (SHA-1 > MD5).
Практика
Одним из важных достоинств UUID является то, что их уникальность не зависит от центрального авторизующего органа или от координации между разными системами. Кто угодно может создать UUID с определённой уверенностью в том, что в обозримом будущем это значение больше никем не будет сгенерировано.
Это позволяет комбинировать в одной БД идентификаторы, созданные разными участниками, или перемещать идентификаторы между базами с ничтожной вероятностью коллизии.
UUID можно использовать в качестве первичных ключей в базах данных, в качестве уникальных имён загружаемых файлов, уникальных имён любых веб-источников. Для их генерирования вам не нужен центральный авторизующий орган. Но это обоюдоострое решение. Из-за отсутствия контролёра невозможно отслеживать сгенерированные UUID.
Есть и ещё несколько недостатков, которые нужно устранить. Неотъемлемая случайность повышает защищённость, однако она усложняет отладку. Кроме того, UUID может быть избыточным в некоторых ситуациях. Скажем, не имеет смысла использовать 128 битов для уникальной идентификации данных, общий размер которых меньше 128 битов.
Уникальность
Может показаться, что если у вас будет достаточно времени, то вы сможете повторить какое-то значение. Особенно в случае с версией 4. Но в реальности это не так. Если бы вы генерировали один миллиард UUID в секунду в течение 100 лет, то вероятность повторения одного из значений была бы около 50 %. Это с учётом того, что ГПСЧ обеспечивает достаточное количество энтропии (истинная случайность), иначе вероятность появления дубля будет выше. Более наглядный пример: если бы вы сгенерировали 10 триллионов UUID, то вероятность появления двух одинаковых значений равна 0,00000006 %.
А в случае с версией 1 часы обнулятся только в 3603 году. Так что если вы не планируете поддерживать работу своего сервиса ещё 1583 года, то вы в безопасности.
Впрочем, вероятность появления дубля остаётся, и в некоторых системах стараются это учитывать. Но в подавляющем большинстве случаев UUID можно считать полностью уникальными. Если вам нужно больше доказательств, вот простая визуализация вероятности коллизии на практике.