mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Add gen_random_uuid function
This adds a built-in function to generate UUIDs. PostgreSQL hasn't had a built-in function to generate a UUID yet, relying on external modules such as uuid-ossp and pgcrypto to provide one. Now that we have a strong random number generator built-in, we can easily provide a version 4 (random) UUID generation function. This patch takes the existing function gen_random_uuid() from pgcrypto and makes it a built-in function. The pgcrypto implementation now internally redirects to the built-in one. Reviewed-by: Fabien COELHO <coelho@cri.ensmp.fr> Discussion: https://www.postgresql.org/message-id/6a65610c-46fc-2323-6b78-e8086340a325@2ndquadrant.com
This commit is contained in:
@ -416,3 +416,23 @@ uuid_hash_extended(PG_FUNCTION_ARGS)
|
||||
|
||||
return hash_any_extended(key->data, UUID_LEN, PG_GETARG_INT64(1));
|
||||
}
|
||||
|
||||
Datum
|
||||
gen_random_uuid(PG_FUNCTION_ARGS)
|
||||
{
|
||||
pg_uuid_t *uuid = palloc(UUID_LEN);
|
||||
|
||||
if (!pg_strong_random(uuid, UUID_LEN))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INTERNAL_ERROR),
|
||||
errmsg("could not generate random values")));
|
||||
|
||||
/*
|
||||
* Set magic numbers for a "version 4" (pseudorandom) UUID, see
|
||||
* http://tools.ietf.org/html/rfc4122#section-4.4
|
||||
*/
|
||||
uuid->data[6] = (uuid->data[6] & 0x0f) | 0x40; /* time_hi_and_version */
|
||||
uuid->data[8] = (uuid->data[8] & 0x3f) | 0x80; /* clock_seq_hi_and_reserved */
|
||||
|
||||
PG_RETURN_UUID_P(uuid);
|
||||
}
|
||||
|
Reference in New Issue
Block a user