我对以上任何一个答案都不完全满意:Java 通常没有安装,dbms_crypto 需要授权,sys_guid() 是连续的。
我决定了。
create or replace function random_uuid return VARCHAR2 is
random_hex varchar2(32);
begin
random_hex := translate(DBMS_RANDOM.string('l', 32), 'ghijklmnopqrstuvwxyz', '0123456789abcdef0123');
return substr(random_hex, 1, 8)
|| '-' || substr(random_hex, 9, 4)
|| '-' || substr(random_hex, 13, 4)
|| '-' || substr(random_hex, 17, 4)
|| '-' || substr(random_hex, 21, 12);
end random_uuid;
/
dbms_random(默认情况下)是公开的,因此不需要授权,而且是相当随机的。请注意,dbms_random 不是加密安全的,因此如果需要,请使用上面的 dbms_crypto 方法。十六进制值分布也被 translate 函数扭曲。
如果您需要真正的 UUID 4 输出,那么您可以调整 substr(我只需要唯一性)。
同样的技术可以在没有函数的情况下用在 sql 中,但有一些想象力:
select
substr(rand, 1, 8)
|| '-' || substr(rand, 9, 4)
|| '-' || substr(rand, 13, 4)
|| '-' || substr(rand, 17, 4)
|| '-' || substr(rand, 21, 12)
from (select translate(DBMS_RANDOM.string('l', 32), 'ghijklmnopqrstuvwxyz', '0123456789abcdef0123') rand from dual);