A custom uuid_v4() function
Here's the function, with comments explaining each group:
CREATE FUNCTION uuid_v4() RETURNS CHAR(36)
BEGIN
-- 1st group is 8 characters = 4 bytes
SET @g1 = HEX(RANDOM_BYTES(4));
-- 2nd group is 4 characters = 2 bytes
SET @g2 = HEX(RANDOM_BYTES(2));
-- 3rd group is 4 characters = 2 bytes, starting with a: 4
SET @g3 = CONCAT('4', SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3));
-- 4th group is 4 characters = 2 bytes, starting with a: 8, 9, A, or B
SET @g4 = CONCAT(HEX(FLOOR(ASCII(RANDOM_BYTES(1)) / 64) + 8), SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3));
-- 1st group is 12 characters = 6 bytes
SET @g5 = HEX(RANDOM_BYTES(6));
RETURN LOWER(CONCAT(@g1, '-', @g2, '-', @g3, '-', @g4, '-', @g5));
END;
Here's a version without variables, to remove any overhead they might add:
CREATE FUNCTION uuid_v4() RETURNS CHAR(36)
BEGIN
RETURN LOWER(CONCAT(
HEX(RANDOM_BYTES(4)),
'-', HEX(RANDOM_BYTES(2)),
'-4', SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3),
'-', HEX(FLOOR(ASCII(RANDOM_BYTES(1)) / 64) + 8), SUBSTR(HEX(RANDOM_BYTES(2)), 2, 3),
'-', hex(RANDOM_BYTES(6))
));
END;
This uses RANDOM_BYTES() instead of RAND() because the former is non-deterministic and therefore more cryptographically secure, resulting in fewer UUID collisions in the end.
RANDOM_BYTES() was introduced in MySQL v5.6.17 (2014) , and is currently not available in MariaDB.