PostgreSQL中是否存在可将RFC 4122 UUID转换为ISO 8824 OID的函数
PostgreSQL 中UUID转合规2.25前缀OID的实现说明
PostgreSQL核心功能没有内置直接完成这类转换的原生函数,可通过简单的自定义逻辑完全匹配要求的转换规则完成转换。
核心转换规则
这类转换需要严格遵循ISO 8824下2.25节点的对象标识符规范:
- 输出OID固定使用
2.25.作为公共前缀 - 后缀为完整128位UUID对应的单个无符号大整数的十进制字符串,不对UUID做分段拆分,整体作为单个整数做直接编码
- 转换示例:输入UUID值
f81d4fae-7dec-11d0-a765-00a0c91e6bf6,输出对应标准OID为2.25.329800735698586629295641978511506172918
可直接落地的实现方案
PostgreSQL的任意精度numeric数值类型可完整容纳128位无符号整数的全部取值范围,通过SQL自定义函数即可实现合规转换,函数定义如下:
CREATE OR REPLACE FUNCTION uuid_to_oid(uuid_val uuid) RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE AS $$ SELECT '2.25.' || ( -- 移除UUID格式中的连字符,拼接为连续十六进制字符串,转为128位位值后转换为十进制大整数 ('x' || replace(uuid_val::text, '-', ''))::bit(128)::numeric )::text; $$;
效果验证
调用函数传入示例UUID值:SELECT uuid_to_oid('f81d4fae-7dec-11d0-a765-00a0c91e6bf6'::uuid);
输出结果与标准OID值完全一致,符合格式要求。
合规性说明
转换逻辑参考了对象标识符注册体系中2.25节点的使用约定、DICOM标准中基于UUID派生全局唯一标识的相关规范,生成的OID不存在注册冲突风险。
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

