Функция ABL GUID и стандарты
GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Представляет собой некоторую реализацию стандарта Universally Unique Identifier (UUID), в частности, реализацию Microsoft.
UUID/GUID задокументирован как часть ISO/IEC 11578:1996 «Information technology — Open Systems Interconnection — Remote Procedure Call (RPC)» и позже в ITU-T Rec. X.667 | ISO/IEC 9834-8:2008 (Соответствующий стандарт России: ГОСТ Р ИСО/МЭК 9834-8-2011).
Существует несколько версий и вариантов алгоритмов формирования GUID, причем информация об использованной версии/варианте кодируется следующим образом:
123e4567-e89b-12d3-a456-426655440000 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
4 бита M обозначают версию (“version”), а 3 старших бита N обозначают вариант (“variant”) GUID.
В OpenEdge ABL имеются встроенные функции GUID и GENERATE-UUID, позволяющие генерировать GUID в программах на ABL:
MESSAGE GUID(GENERATE-UUID) VIEW-AS ALERT-BOX.
Однако генерируемый GUID не соответствует вышеупомянутым стандартам. Так, 15 символ сгенерированного GUID принимает случайные значения вместо постоянного номера версии.
PSC дает этому следующее объяснение:
The ABL GUID function came into existence in order to generate primary index keys in an OE database, where the GUID function would guarantee the generation of unique 16 byte values across a broad number of concurrently running database clients, including the database itself. Its algorithm did originated from a standards group’s implementation of a Type 1 (date + MAC) GUID, where the subfields were then rearranged from the standard GUID subfield order to an OpenEdge subfield order, to enhance index compaction, storage and performance.
Переводя, функция ABL GUID появилась для того, чтобы генерировать ключи первичных индексов в базе данных OE, где функция GUID гарантировала бы генерацию уникальных 16-байтовых значений для широкого числа одновременно работающих клиентов базы данных, включая саму базу данных. Ее алгоритм действительно возник из реализации группы стандартов GUID типа 1 (Дата + MAC), где подполя были затем перестроены из стандартного порядка подполей GUID в порядок подполей OpenEdge, чтобы улучшить сжатие, хранение и производительность индексов.
Таким образом, к сожалению, невозможно использовать функцию GUID для генерации значений, соответствующих стандарту.
В PSC направлен запрос на исправление этой ситуации, что, очевидно, потребует некоторого времени. Ссылка на запрос:
https://openedge.ideas.aha.io/ideas/OPENEDGE-I-815
Вы можете просмотреть запрос по данной ссылке (для доступа необходим ProgressID) и проголосовать за него.
В настоящее время, к счастью, для генерации GUID, соответствующих стандарту на большинстве платформ имеются встроенные средства, которые легко могут быть интегрированы в приложение ABL.
Linux предоставляет команду uuidgen, которая может генерировать GIUD версии 1 (uuidgen –t) и версии 4 (uuidgen –r, ключ –r является ключом по умолчанию). Аналогичные команды можно найти и для других UNIX-платформ, например uuid_get в AIX.
Для Windows доступна для скачивания бесплатная программа uuidgen.exe (https://www.pconlife.com/viewfileinfo/uuidgen-exe/), для 32 и 64-битовых архитектур. По умолчанию генерируется GUID версии 4. Для генерации версии 1 необходимо указать ключ –x.
Пример кода на ABL для генерации GUID версии 1:
DEFINE VARIABLE ccc AS CHARACTER NO-UNDO. IF OPSYS = "WIN32" THEN INPUT THROUGH VALUE("f:\bin\uuidgen.exe -x"). ELSE INPUT THROUGH VALUE("uuidgen -t"). IMPORT ccc. INPUT CLOSE. MESSAGE ccc VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
В Windows 10 для генерации GUID версии 4 (от версии 1 Microsoft отказалась) можно также использовать PowerShell, например:
DEFINE VARIABLE ccc AS CHARACTER NO-UNDO. OS-COMMAND NO-CONSOLE('cmd /c powershell.exe -Command "[guid]::NewGuid().ToString()|Set-Clipboard"'). ccc = CLIPBOARD:VALUE. MESSAGE ccc VIEW-AS ALERT-BOX INFORMATION BUTTONS OK.
Метка:ABL(4GL)