Dit bedacht, hier is een functie die het doet:
CREATE OR REPLACE FUNCTION generate_uid(size INT) RETURNS TEXT AS $$
DECLARE
characters TEXT := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
bytes BYTEA := gen_random_bytes(size);
l INT := length(characters);
i INT := 0;
output TEXT := '';
BEGIN
WHILE i < size LOOP
output := output || substr(characters, get_byte(bytes, i) % l + 1, 1);
i := i + 1;
END LOOP;
RETURN output;
END;
$$ LANGUAGE plpgsql VOLATILE;
En om het vervolgens uit te voeren, doe je gewoon:
generate_uid(10)
-- '3Rls4DjWxJ'
Waarschuwing
Wanneer u dit doet, moet u er zeker van zijn dat de lengte van de ID's die u aanmaakt voldoende is om botsingen in de loop van de tijd te voorkomen naarmate het aantal objecten dat u hebt gemaakt groeit, wat contra-intuïtief kan zijn vanwege de Verjaardagsparadox
. Je zult dus waarschijnlijk een lengte willen die groter (of veel groter) is dan 10
voor elk redelijk algemeen gemaakt object heb ik zojuist 10
. gebruikt als een eenvoudig voorbeeld.
Gebruik
Als de functie is gedefinieerd, kunt u deze als volgt in een tabeldefinitie gebruiken:
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT generate_uid(10),
name TEXT NOT NULL,
...
);
En dan bij het invoegen van gegevens, zoals zo:
INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;
Het genereert automatisch de id
waarden:
id | name | ...
-----------+--------+-----
owmCAx552Q | ian |
ZIofD6l3X9 | victor |
Gebruik met een voorvoegsel
Of misschien wil je voor het gemak een voorvoegsel toevoegen wanneer je naar een enkele ID in de logs of in je debugger kijkt (vergelijkbaar met hoe Stripe het doet ), zoals zo:
CREATE TABLE collections (
id TEXT PRIMARY KEY DEFAULT ('col_' || generate_uid(10)),
name TEXT NOT NULL,
...
);
INSERT INTO collections (name) VALUES ('One');
INSERT INTO collections (name) VALUES ('Two');
INSERT INTO collections (name) VALUES ('Three');
SELECT * FROM collections;
id | name | ...
---------------+--------+-----
col_wABNZRD5Zk | ian |
col_ISzGcTVj8f | victor |