Conversión de base múltiple: uso de todas las combinaciones para acortador de URL
Estoy haciendo un acortador de URL, y estoy luchando con la forma óptima de codificar un número (id) en una cadena de caracteres.
Estoy usando los caracteres 0-9, A-Z, a-z, por lo que básicamente será una codificación de base 62. Eso es bastante básico, pero no hace uso de todos los códigos posibles. Los códigos que produciría serían:
0, 1, ... y, z, 10, 11, ... zy, zz, 100, 101, ...
Observe que no se utilizan los códigos 00 a 0z, lo mismo para 000 a 0zz, y así sucesivamente. Me gustaría usar todos los códigos, así:
0, 1, ... y, z, 00, 01, ... zy, zz, 000, 001, ...
Sería una combinación de base-62 y base-63, con diferentes bases dependiendo de la posición ... Usar base-62 es fácil, por ejemplo:
create procedure tiny_GetCode
@UrlId int
as
set nocount on
declare @Code varchar(10)
set @Code = ''
while (@UrlId > 0 or len(@Code) = 0) begin
set @Code = substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', @UrlId % 62 + 1, 1) + @Code
set @UrlId = @UrlId / 62
end
select @Code
Pero todavía no he logrado hacer una conversión de múltiples bases, para hacer uso de todos los códigos.