Per generare identificatori univoci e dall'aspetto casuale da un seriale, l'utilizzo di cifrari potrebbe essere una buona idea. Poiché il loro output è biunivoco (c'è una mappatura uno-a-uno tra i valori di input e di output), non avrai alcuna collisione , a differenza degli hash. Ciò significa che i tuoi identificatori non devono essere lunghi quanto gli hash.
La maggior parte dei codici crittografici funziona su blocchi a 64 bit o più grandi, ma il wiki di PostgreSQL ha un esempio di procedura PL/pgSQL per una cifra "non crittografica"
funzione che funziona su (32-bit) int
genere. Dichiarazione di non responsabilità:non ho provato a utilizzare questa funzione da solo.
Per usarlo per le tue chiavi primarie, esegui la chiamata CREATE FUNCTION dalla pagina wiki, quindi sul tuo vuoto le tabelle fanno:
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)