För att generera unika och slumpmässiga identifierare från en serie kan det vara en bra idé att använda chiffer. Eftersom deras utdata är bijektiv (det finns en en-till-en-mappning mellan ingångs- och utdatavärden) -- kommer du inte att ha några kollisioner , till skillnad från hash. Vilket innebär att dina identifierare inte behöver vara lika långa som hash.
De flesta kryptografiska chiffer fungerar på 64-bitars eller större block, men PostgreSQL-wikin har en exempel PL/pgSQL-procedur för ett "icke-kryptografiskt" chiffer
funktion som fungerar på (32-bitars) int
typ. Ansvarsfriskrivning:Jag har inte provat att använda den här funktionen själv.
För att använda den för dina primärnycklar, kör CREATE FUNCTION-anropet från wikisidan och sedan på din tomma tabeller gör:
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
Och voila!
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)