Pour générer des identifiants uniques et aléatoires à partir d'une série, l'utilisation de chiffrements peut être une bonne idée. Étant donné que leur sortie est bijective (il existe un mappage un à un entre les valeurs d'entrée et de sortie) - vous n'aurez pas de collisions , contrairement aux hachages. Cela signifie que vos identifiants n'ont pas besoin d'être aussi longs que des hachages.
La plupart des chiffrements cryptographiques fonctionnent sur des blocs de 64 bits ou plus, mais le wiki PostgreSQL a un exemple de procédure PL/pgSQL pour un chiffrement "non cryptographique"
fonction qui fonctionne sur (32 bits) int
taper. Avis de non-responsabilité :je n'ai pas essayé d'utiliser cette fonction moi-même.
Pour l'utiliser pour vos clés primaires, exécutez l'appel CREATE FUNCTION à partir de la page wiki, puis sur votre vide les tables font :
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
Et 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)