Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Identificador único con md5()

From: Emanuel Calvo Franco <postgres(dot)arg(at)gmail(dot)com>
To: Sebastián Villalba <sebastian(at)fcm(dot)unc(dot)edu(dot)ar>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, Lista Ayuda Pgsql <pgsql-es-ayuda(at)postgresql(dot)org>, Fernando Hevia <fhevia(at)ip-tel(dot)com(dot)ar>
Subject: Re: [pgsql-es-ayuda] RE: [pgsql-es-ayuda] Identificador único con md5()
Date: 2010-02-25 15:52:45
Message-ID: f205bb121002250752q3a62e055n8786ea169433774a@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 25 de febrero de 2010 10:15, Sebastián Villalba
<sebastian(at)fcm(dot)unc(dot)edu(dot)ar> escribió:
> On Wed, 24 Feb 2010 23:23:01 -0300, Alvaro Herrera wrote
>> Sebastián Villalba escribió:
>> > Efectivamente necesito algo así, que no siga patrón correlativo o determinado.
>> > El único requisito es que la longitud debe ser de 7. Por un antojo el
>> > "substring(md5(CURRENT_TIME::time)from 7 for 7)" lo hago a partir de la
>> > séptima posición, porque se me ocurrió hacerlo así, pero sin contar con ningún
>> > fundamento teórico.
>>
>> Supongo que lo que puedes hacer si te interesa asegurar unicidad es
>> convertir el número de la función de Verite en un string de 7
>> caracteres.  Claro que tendrías que modificarla, porque con una
>> cadena de largo 7 en hex tienes a lo más 268.435.456 cadenas
>> distintas (16^7), pero la función de Verite retorna 2^32 valores
>> distintos (4 mil millones y fracción)
>>
>> Lo otro que podrías hacer es usar 24 dígitos en vez de 16, con lo que
>> tienes espacio para 4500 millones de valores; cubrirías todo el espacio
>> de Verite y un poco más.  Ahí el único trabajo que tendrías sería
>> inventar cómo mapear un número de 32 bits a un string ...
>
> Bueno, yo tengo en un sistemita algo similar, pero que si sigue un orden
> correlativo. Necesitaba un código único, alfanumérico de 6 dígitos.
>
> Lo que hago es codificar un campo serial (para garantizar unicidad) en base 36
> (utilizando todas las letras utilizables del alfabeto) con lo que tengo 6^36
> (un número muy grande).
>
> Un par de ejemplos de la salida:
>
> seba=# SELECT * FROM generar_codigo();
>  generar_codigo
> ----------------
>  0076A4
> (1 fila)
>
> seba=# SELECT * FROM generar_codigo();
>  generar_codigo
> ----------------
>  0076A5
> (1 fila)
>
> Por si a alguien le sirve, adjunto el código. Son 2 funciones en plpgsql. Saludos!
>

Y no te convendría utilizar UUID para la unicidad?

postgres=# select uuid_generate_v1()::Text from generate_Series(1,10);
uuid_generate_v1
--------------------------------------
8f5d1cb0-2225-11df-ade2-00248cde5fee
8f5d1e90-2225-11df-94d5-00248cde5fee
8f5d1fc6-2225-11df-af75-00248cde5fee
8f5d20f2-2225-11df-9334-00248cde5fee
8f5d2214-2225-11df-ac0b-00248cde5fee
8f5d237c-2225-11df-8e70-00248cde5fee
8f5d24a8-2225-11df-a715-00248cde5fee
8f5d25ca-2225-11df-bbb1-00248cde5fee
8f5d26f6-2225-11df-9d32-00248cde5fee
8f5d285e-2225-11df-8a44-00248cde5fee

--
Emanuel Calvo Franco
DBA at: www.siu.edu.ar
www.emanuelcalvofranco.com.ar
Join: http://www.thevenusproject.com/

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message coconauta 2010-02-25 16:25:31 Re: problema arranque postgres y programa java
Previous Message Silvio Quadri 2010-02-25 15:28:31 Re: problema arranque postgres y programa java