Я пытаюсь написать хранимую функцию MySQL для генерации UUID v4, как описано в разделе 4.4 RFC 4122 (http://www.ietf.org/rfc/rfc4122.txt).Мои первоначальные наивные усилия после нескольких настроек следующие:
CREATE FUNCTION UUID_V4()
RETURNS BINARY(16)
READS SQL DATA
BEGIN
SET @uuid = CONCAT(
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' ),
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' ),
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' ),
LPAD( HEX( FLOOR( RAND() * 4294967296 ) ), 8, '0' )
);
SET @uuid = CONCAT(
SUBSTR( @uuid FROM 1 FOR 12 ),
'4',
SUBSTR( @uuid FROM 14 FOR 3 ),
SUBSTR( 'ab89' FROM FLOOR( 1 + RAND() * 4 ) FOR 1 ),
SUBSTR( @uuid FROM 18 )
);
RETURN UNHEX(@uuid);
END
Вышеуказанная функция довольно медленная: почти в 100 раз медленнее, чем встроенная UUID()
, согласно функции MySQL BENCHMARK()
.Если не считать написания UDF с использованием MySQL C API, есть ли какие-либо улучшения, которые я могу сделать здесь, чтобы, скажем, сократить порядок на порядок по сравнению с его временем выполнения?
Если существует уже существующий, UDID UDID, рассматриваемый UUIDили хранимой процедуры, я был бы рад услышать об этом тоже.