Подтвердить что ты не робот

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

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

SQL> select sys_guid() from dual;

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

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

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

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

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

xxxxxxxx-xxxx-3xxx-xxxx-xxxxxxxxxxxx
4b9b3361

Ответ 1

SYS_GUID является эквивалентом Oracle UUID. Он глобально уникален. Однако он не соответствует RFC 4122; Я выхожу из-за отсутствия соответствия из-за отсутствия ссылок на UUID в документации (вне документации Java XML).

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

Ответ 2

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

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  

Ответ 3

Имея достаточные привилегии, возможно, что Oracle генерирует совместимые UUID.

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

Из fooobar.com/info/257255/... вы можете сделать следующее:

create or replace function random_uuid return RAW is
  v_uuid RAW(16);
begin
  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, см. fooobar.com/info/257255/....