How to generate a version 4 (random) UUID on Oracle?

前端 未结 9 1103
野性不改
野性不改 2020-12-05 10:37

This blog explains, that the output of sys_guid() is not random for every system:

http://feuerthoughts.blogspot.de/2006/02/watch-out-for-sequential-orac

9条回答
  •  囚心锁ツ
    2020-12-05 11:34

    there are some pure plsql functions written by me and one of my friend that generates uuid version 4 and formats any type of GUIDs. also formatters written in two way. one concating string and one use regex for formatting uuid

    CREATE OR REPLACE FUNCTION RANDOM_UUD_RAW
      RETURN RAW IS V_UUID RAW(16);
      BEGIN V_UUID := SYS.DBMS_CRYPTO.Randombytes(16);
        V_UUID := UTL_RAW.Overlay(UTL_RAW.Bit_or(UTL_RAW.Bit_and(UTL_RAW.Substr(V_UUID, 7, 1), '0F'), '40'), V_UUID, 7, 1);
        V_UUID := UTL_RAW.Overlay(UTL_RAW.Bit_or(UTL_RAW.Bit_and(UTL_RAW.Substr(V_UUID, 9, 1), '3F'), '80'), V_UUID, 9, 1);
        RETURN V_UUID;
      END RANDOM_UUD_RAW; --
    CREATE OR REPLACE FUNCTION UUID_FORMATTER_CONCAT(V_UUID RAW)
      RETURN VARCHAR2 IS V_STR VARCHAR2(36);
      BEGIN V_STR := lower(SUBSTR(V_UUID, 1, 8) || '-' || SUBSTR(V_UUID, 9, 4) || '-' || SUBSTR(V_UUID, 13, 4) || '-' || SUBSTR(V_UUID, 17, 4) || '-' || SUBSTR(V_UUID, 21));
        RETURN V_STR;
      END UUID_FORMATTER_CONCAT; --
    CREATE OR REPLACE FUNCTION UUID_FORMATTER_REGEX(V_UUID RAW)
      RETURN VARCHAR2 IS V_STR VARCHAR2(36);
      BEGIN V_STR := lower(regexp_replace(V_UUID, '(.{8})(.{4})(.{4})(.{4})(.{12})', '\1-\2-\3-\4-\5'));
        RETURN V_STR;
      END UUID_FORMATTER_REGEX; --
    CREATE OR REPLACE FUNCTION RANDOM_UUID_STR
      RETURN VARCHAR2 AS BEGIN RETURN UUID_FORMATTER_CONCAT(RANDOM_UUD_RAW());
      END RANDOM_UUID_STR; --
    CREATE OR REPLACE FUNCTION RANDOM_UUID_STR_REGEX
      RETURN VARCHAR2 AS BEGIN RETURN UUID_FORMATTER_REGEX(RANDOM_UUD_RAW());
      END RANDOM_UUID_STR_REGEX;
    
    
    

提交回复
热议问题