Do generowania unikalnych i losowo wyglądających identyfikatorów z numeru seryjnego dobrym pomysłem może być użycie szyfrów. Ponieważ ich dane wyjściowe są bijektywne (istnieje mapowanie jeden do jednego między wartościami wejściowymi i wyjściowymi) -- nie będziesz mieć żadnych kolizji , w przeciwieństwie do skrótów. Co oznacza, że Twoje identyfikatory nie muszą być tak długie jak hasze.
Większość szyfrów kryptograficznych działa na blokach 64-bitowych lub większych, ale wiki PostgreSQL zawiera przykładową procedurę PL/pgSQL dla szyfru „niekryptograficznego”
funkcja działająca na (32-bitowym) int
rodzaj. Zastrzeżenie:sam nie próbowałem korzystać z tej funkcji.
Aby użyć go dla kluczy podstawowych, uruchom wywołanie CREATE FUNCTION na stronie wiki, a następnie na swoim pustym stoły robią:
ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
I 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)