Uno de los problemas que tienen los UUID es que pueden resultar demasiado largos para algunas aplicaciones. Aquí veremos un método para reducir los clásicos UUID de 36 caracteres a 25.

Supongamos que a cada usuario registrado en nuestro sistema le asignamos un UUID, el cual tenemos que incluir en la url para visualizar su perfil. Esta URL quedaría algo más o menos así:
http://example.com/users/profile/4a3009bd-43f4-4535-ae3e-08a0650df841

Si observamos la composición de un UUID vemos que todos sus caracteres son números hexadecimales (excepto los guiones). Hay muchos caracteres que no están siendo utilizados en esta cadena y si convertimos los números hexadecimales a una base mayor que utilice más caracteres, podríamos reducir la cadena.

PHP tiene una función llamada base_convert que toma tres argumentos: el número a convertir, la base en la que se encuentra dicho número y la base a la cual lo queremos convertir. Si a esta función le pasamos nuestro UUID generado por CakePHP para convertirlo a base 36 (la máxima base que soporta dicha función) y lo pasamos a mayúsculas (sólo para que sea más prolijo), nos queda una cadena de 25 caracteres similar a esta: 4FPTDWER5VQ4G4S408C8O8WO0. La cadena generada sigue siendo única porque el número que representa es el mismo que el UUID original, sólo que está convertido a otra base mayor.

Ahora, para hacer un poco más sencillo el proceso, sería ideal que CakePHP genere automáticamente estos UUID cortos, del mismo modo que los hace con los largos. Si el campo id de una tabla es una cadena de 36 caracteres CHAR(36) o VARCHAR(36), CakePHP genera automáticamente un UUID por cada insert que se hace en la tabla. Con este behavior logramos el mismo comportamiento pero para aquellos campos id que sean cadenas de 25 caracteres. Veamos el código.

<?php

Class ShortUuidBehavior extends ModelBehavior {


	function setup(&$Model, $settings) {
	}


	function beforeSave(&$Model) {
		if(
			empty($Model->data[$Model->alias]['id'])
			and $Model->_schema['id']['length'] == 25
			and $Model->_schema['id']['key'] == 'primary'
			and $Model->_schema['id']['type'] == 'string'
		) {
			$Model->data[$Model->alias]['id'] = $this->_generateShortUUID();
		}
	}


	function _generateShortUUID() {
		$uuid = str_replace('-', '', String::uuid());
		return strtoupper(base_convert($uuid, 16, 36));
	}

}

?>

Este behavior se puede ubicar dentro de app_model.php, ya que sólo afectará a aquellos modelos cuyo id sea una cadena de 25 caracteres.