Oracle 19c如何按需生成基于命名空间和用户名的UUID v3/v5
Oracle 19c 按需即时生成UUID v3/v5实现方案
Oracle 19c没有内置支持「命名空间+自定义名称」生成UUID v3/v5的原生函数,我们可以通过自定义PL/SQL函数实现,生成过程完全是即时计算,不会持久化存储生成结果,符合你的需求。
前置准备
- 首先需要给你的业务数据库账号授予加密包调用权限,用DBA账号执行以下授权语句:
GRANT EXECUTE ON SYS.DBMS_CRYPTO TO 你的业务账号;
- 提前确定你要使用的固定命名空间UUID:UUID v3/v5要求命名空间本身是合法UUID,你可以用官方预定义的公共命名空间,也可以将你的常量字符串
Name space生成一个固定UUID作为业务专属命名空间,保证所有生成的UUID都基于同一个根命名空间即可。示例中我们使用927aac70-390b-4d18-9259-250c3afd3b57作为对应Name space的固定UUID,你可以自行替换为你需要的值。
实现自定义UUID生成函数
方案1:生成UUID v5(推荐,基于SHA1加密,安全性更高)
CREATE OR REPLACE FUNCTION uuid_v5(p_namespace_uuid IN VARCHAR2, p_name IN VARCHAR2) RETURN VARCHAR2 IS v_raw_namespace RAW(16); v_raw_name RAW(2000); v_hash RAW(20); v_hex VARCHAR2(36); BEGIN -- 将命名空间UUID转换为RAW格式 v_raw_namespace := HEXTORAW(REPLACE(p_namespace_uuid, '-', '')); -- 拼接命名空间和名称后计算SHA1哈希 v_raw_name := UTL_I18N.STRING_TO_RAW(p_name, 'AL32UTF8'); v_hash := DBMS_CRYPTO.HASH(UTL_RAW.CONCAT(v_raw_namespace, v_raw_name), DBMS_CRYPTO.HASH_SH1); -- 设置UUID版本为5(第13位字符改为5) v_hash := UTL_RAW.SUBSTR(v_hash, 1, 6) || '5' || UTL_RAW.SUBSTR(v_hash, 7, 10); -- 设置UUID变体为RFC4122(第17位字符改为8) v_hash := UTL_RAW.SUBSTR(v_hash, 1, 8) || '8' || UTL_RAW.SUBSTR(v_hash, 9, 11); -- 格式化为带横杠的标准UUID格式 v_hex := LOWER( SUBSTR(v_hash, 1, 8) || '-' || SUBSTR(v_hash, 9, 4) || '-' || SUBSTR(v_hash, 13, 4) || '-' || SUBSTR(v_hash, 17, 4) || '-' || SUBSTR(v_hash, 21, 12) ); RETURN v_hex; END; /
方案2:生成UUID v3(基于MD5加密)
如果需要使用v3版本,仅需要把上述函数中的哈希算法替换为DBMS_CRYPTO.HASH_MD5,同步调整对应哈希参数的长度即可,核心逻辑完全一致。
调用方式
函数创建完成后就可以直接按照你期望的语法调用,替换为你自己的命名空间UUID即可:
SELECT uuid_v5('927aac70-390b-4d18-9259-250c3afd3b57', a.username) uuid FROM USER_TABLE a where a.username = 'username';
特性说明
- 生成过程完全是即时计算,不会写入数据库任何表,完全满足你按需生成的需求
- 同一个命名空间+同一个用户名生成的UUID固定不变,符合UUID v3/v5的标准特性
内容的提问来源于stack exchange,提问作者koa73
相关产品推荐
相关产品推荐

