PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sequenz durch Zufallszahl ersetzen

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)