Re: Sequential UUID Generation

Поиск
Список
Период
Сортировка
От Uday Bhaskar V
Тема Re: Sequential UUID Generation
Дата
Msg-id CAFowjW2v5ytzaHRm1LDoUB7K1BCpAx-SmuAnH2nyQAT2ea4JRA@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Sequential UUID Generation  (Sehrope Sarkuni <sehrope@jackdb.com>)
Ответы Re: Sequential UUID Generation  (Tomas Vondra <tomas.vondra@2ndquadrant.com>)
Список pgsql-hackers
I tried below function as which can be used as default to column. But every time we need to created 2 sequences, 1st one takes care of the first 8 bytes and 2nd takes care of the 2nd part of the UUID. I have not tested index and space utilization. I have to examine this. This might not be completely unique in the nature. but still trying for the best.


CREATE OR REPLACE FUNCTION public.fnu_generate_sequential_uuid(
sequence1 text,
sequence2 text)
    RETURNS uuid
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE NOT LEAKPROOF 
AS $function$

DECLARE
  sequenceUUIDPart1 text;
  randomUUIDPart2 text;
  counter integer:=0;
  significantByte integer:=0; 
  startIndex integer:=0;
  endIndex integer:=0;
BEGIN
  
    -- Get random UUID
    randomUUIDPart2 := replace(( uuid_generate_v4 () :: text),'-',''); 

-- verify first sequence reached max count.
IF to_hex(currval(sequence1)) :: text = '7fffffffffffffff' THEN
         startIndex:=0;
         endIndex:=7;
    -- convert sequence into 32 bit string
    sequenceUUIDPart1 = rpad(to_hex(nextval(sequence2))::text, 32, '0');
    ELSE
      startIndex:=8;
         endIndex:=15;
    -- convert sequence into 32 bit string
    sequenceUUIDPart1 = rpad(to_hex(nextval(sequence1))::text, 32, '0');
    END IF;
    
    RAISE NOTICE 'current Guid: %', sequenceUUIDPart1;
    
    -- loop through the 8th byte to 16th byte, till first sequence max .
    -- loop through the 0 to 7 the byte till second sequence end.
    FOR counter IN startIndex..endIndex LOOP
     
     select get_byte(decode(sequenceUUIDPart1::text,'hex'), counter) into significantByte;
     
     -- fill last 8 bytes with the generated random UUID values.
     sequenceUUIDPart1 := encode(set_byte(decode(sequenceUUIDPart1 ::text,'hex') :: bytea ,counter, significantByte ) :: bytea, 'hex') :: text;
     RAISE NOTICE 'current Guid: %', sequenceUUIDPart1;
    END LOOP; 
    
   return sequenceUUIDPart1 :: UUID;
  EXCEPTION
  WHEN OTHERS
    THEN
      RAISE EXCEPTION 'An error was encountered in create_engagement_data_get_aud_area_ent_list - % -ERROR- %', sqlstate, sqlerrm;
END

$function$;

On Wed, Oct 31, 2018 at 1:51 AM Sehrope Sarkuni <sehrope@jackdb.com> wrote:
I came across a project for time based UUID ("tuid") a little while back: https://github.com/tanglebones/pg_tuid

I haven't used in production but skimmed through the code a bit out of technical curiosity. It handles some of the expected edge cases for backwards clock drift and concurrent generation.

The repo includes a PG extension and sample app code for generating tuids in a couple languages as well as a pure-SQL one (though that one uses random() rather than get_random_bytes() so I'd consider it more of an proof of concept).

Regards,
-- Sehrope Sarkuni
Founder & CEO | JackDB, Inc. | https://www.jackdb.com/

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Daniel Westermann
Дата:
Сообщение: Re: zheap: a new storage format for PostgreSQL
Следующее
От: Nikolay Shaplov
Дата:
Сообщение: Re: [PATCH] get rid of StdRdOptions, use individual binary reloptions representation for each relation kind instead