Я пытаюсь написать хранимую функцию 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, могу ли я внести здесь какие-либо улучшения, чтобы, скажем, на порядок сократить время его выполнения?
Если существует уже существующий, хорошо известный UUID UDF или хранимая процедура , Я тоже буду рада услышать об этом.