Para gerar identificadores únicos e de aparência aleatória a partir de um serial, o uso de cifras pode ser uma boa ideia. Como a saída deles é bijetiva (há um mapeamento um-para-um entre os valores de entrada e saída) -- você não terá colisões , ao contrário dos hashes. O que significa que seus identificadores não precisam ser tão longos quanto hashes.
A maioria das cifras criptográficas funciona em blocos de 64 bits ou maiores, mas o wiki do PostgreSQL tem um exemplo de procedimento PL/pgSQL para uma cifra "não criptográfica" função que funciona em (32 bits)
int
modelo. Isenção de responsabilidade:eu mesmo não tentei usar esta função. Para usá-lo para suas chaves primárias, execute a chamada CREATE FUNCTION na página do wiki e, em seguida, em seu empty tabelas fazem:
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
E voilá!
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)