Соответствует ли Oracle SYS_GUID() UUID RFC 4122?

Интересно, возвращает ли функция Oracle SYS_GUID() UUID, соответствующий RFC 4122? Например:

SQL> select sys_guid() from dual;

SYS_GUID()
--------------------------------
A6C1BD5167C366C6E04400144FD25BA0

Я знаю, что SYS_GUID() возвращает 16-байтовый тип данных RAW. Oracle использует RAWTOHEX() и, вероятно, TO_CHAR(), чтобы распечатать вышеуказанный идентификатор. Правильно ли интерпретировать это как UUID-совместимый формат строки, такой как:

A6C1BD51-67C3-66C6-E044-00144FD25BA0

Я думаю, что он не соответствует стандарту RFC 4122, потому что в определении сказано, что действительный UUID должен называть UUID-Version в самом UUID.

Синтаксис для UUID, соответствующего RFC 4122 (версия 3):

xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx

4 ответа

Решение

SYS_GUID является эквивалентом UUID в Oracle. Это глобально уникально. Тем не менее, он не соответствует RFC 4122; Я предполагаю несоответствие из-за отсутствия ссылок на UUID в документации (за пределами документации Java XML).

Я подозреваю, что Oracle изначально не реализовал RFC 4122, потому что не считает, что он масштабируется. Я не могу себе представить, почему иначе они изобрели бы свою собственную вещь вместо того, чтобы соответствовать стандарту.

Если вы хотите этот формат, попробуйте это:

select regexp_replace(rawtohex(sys_guid())
       , '([A-F0-9]{8})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{4})([A-F0-9]{12})'
       , '\1-\2-\3-\4-\5') 
         as FORMATTED_GUID 
 from dual

Пример результатов:

 FORMATTED_GUID                                                                  
 ------------------------------------
 F680233E-0FDD-00C4-E043-0A4059C654C9  

При наличии достаточных привилегий Oracle может генерировать UUID, совместимые с ними.

1. Определив функцию SQL

С /questions/18841997/kak-sozdat-sluchajnyij-uuid-versii-4-v-oracle/18842023#18842023 вы можете сделать следующее:

создать или заменить функцию random_uuid вернуть RAW
  v_uuid RAW(16);
начать
  v_uuid:= sys.dbms_crypto.randombytes(16);
  return (utl_raw.overlay(utl_raw.bit_or(utl_raw.bit_and(utl_raw.substr(v_uuid, 7, 1), '0F'), '40'), v_uuid, 7));
end random_uuid;

Функция требует dbms_crypto а также utl_raw, Оба требуют выполнения гранта.

grant execute on sys.dbms_crypto to uuid_user;

2. Использование процедуры Java

Чтобы создать процедуру Java для создания совместимого UUID, см. /questions/18841997/kak-sozdat-sluchajnyij-uuid-versii-4-v-oracle/18842009#18842009.

RFC 4122 § 3. Шаблон регистрации пространства имен (стр. 5)

Механизм проверки:
помимо определения того, находится ли часть UUID с отметкой времени
в будущем и, следовательно, еще не может быть назначена, не существует
механизма для определения того, является ли UUID «действительным».

Это процесс генерации, который определяет «соответствие» RFC 4122, сам UUID является просто 128-битным идентификатором идентификатора.

Поэтому ответ - да, почему он не соответствует требованиям? UUID это всего лишь 128 бит Universaly U Nique IDentifier, остальные спецификации просто рекомендовали способы , чтобы помочь вам / Oracle генерировать идентификаторы , которые не конфликтуют с другими системами , которые генерируют UU ID entifiers. Если вы или Oracle не хотите следовать их рекомендациям, они могут это сделать. Тем не менее, указанный вами uuid "соответствует" RFC 4122, поскольку поле варианта начинается с битовой последовательности 111что означает «Зарезервировано для будущего определения.». Спецификация была написана в прошлом и не ограничивает тех, кто может указывать «будущее определение», она, конечно, не мешает Oracle определять свои собственные варианты ... поэтому она «соответствует» ... lol.

ps Мне нравится, как оригинальные авторы предвосхитили ваш вопрос и добавили сарказм в кавычки вокруг слова «действительно».

Другие вопросы по тегам