Соответствует ли 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
Ответы
Ответ 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/....