Para generar identificadores únicos y de aspecto aleatorio a partir de una serie, puede ser una buena idea utilizar cifrados. Dado que su salida es biyectiva (hay un mapeo uno a uno entre los valores de entrada y salida), no tendrá ninguna colisión , a diferencia de los hashes. Lo que significa que sus identificadores no tienen que ser tan largos como hashes.
La mayoría de los cifrados criptográficos funcionan en bloques de 64 bits o más grandes, pero el wiki de PostgreSQL tiene un procedimiento PL/pgSQL de ejemplo para un cifrado "no criptográfico"
función que funciona en (32 bits) int
escribe. Descargo de responsabilidad:no he intentado usar esta función yo mismo.
Para usarlo para sus claves principales, ejecute la llamada CREATE FUNCTION desde la página wiki y luego en su vacío las tablas hacen:
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
¡Y listo!
pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> insert into foo (foo_id) values(default);
pg=> select * from foo;
foo_id
------------
1241588087
1500453386
1755259484
(4 rows)