Estoy trabajando en un sistema que genera identificadores aleatorios como en la respuesta # 2 here.pseudo_encrypt() función en plpgsql que toma bigint
Mi problema es que la función pseudo_encrypt() mencionada funciona con int not bigint. Traté de reescribirlo pero siempre devuelve el mismo resultado:
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 bigint;
l2 int;
r1 bigint;
r2 int;
i int:=0;
BEGIN
l1:= (VALUE >> 32) & 4294967296::bigint;
r1:= VALUE & 4294967296;
WHILE i < 3 LOOP
l2 := r1;
r2 := l1 # ((((1366.0 * r1 + 150889) % 714025)/714025.0) * 32767)::int;
l1 := l2;
r1 := r2;
i := i + 1;
END LOOP;
RETURN ((l1::bigint << 32) + r1);
END;
$$ LANGUAGE plpgsql strict immutable;
¿Alguien puede verificar esto?
Ah la máscara de bits era un error estúpido ... Muchas gracias ¡mucho! Funciona perfectamente ahora! Por cierto, querías sugerir bigint, no int. –
@Daniel Vérité ¿Qué tengo que modificar en la producción si necesito un bigint con una longitud máxima de 13 dígitos? – MattC
@MattC: no es trivial, puede enviar esto como una nueva pregunta. También con esta técnica el límite superior va a ser '2^N' donde' N' es un número par, no '10^N'. –