Um eindeutige und zufällig aussehende Identifikatoren aus einer Seriennummer zu generieren, kann die Verwendung von Chiffren eine gute Idee sein. Da ihre Ausgabe bijektiv ist (es gibt eine Eins-zu-Eins-Zuordnung zwischen Eingabe- und Ausgabewerten), werden Sie keine Kollisionen haben , im Gegensatz zu Hashes. Das bedeutet, dass Ihre Kennungen nicht so lang wie Hashes sein müssen.
Die meisten kryptografischen Chiffren funktionieren auf 64-Bit- oder größeren Blöcken, aber das PostgreSQL-Wiki hat ein Beispiel-PL/pgSQL-Verfahren für eine "nicht-kryptografische" Chiffre
Funktion, die auf (32-Bit) int
funktioniert Typ. Haftungsausschluss:Ich habe diese Funktion nicht selbst ausprobiert.
Um es für Ihre Primärschlüssel zu verwenden, führen Sie den CREATE FUNCTION-Aufruf von der Wiki-Seite und dann auf Ihrem empty aus Tabellen tun:
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
Und 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)