Saya berhasil melakukan konversi. Hal yang rumit adalah bahwa ini bukan hanya konversi basis campuran, basis yang lebih tinggi dari karakter pertama juga memengaruhi nilai kode yang lebih panjang.
Saya mulai dengan kasus yang lebih mudah; kode dasar-10. Saya melihat bahwa rentang dua digit memiliki 10 kode tambahan, rentang tiga digit memiliki 100 kode tambahan, dan seterusnya:
0 - 9 : '0' - '9'
10 - 109 : '00' - '99'
110 - 1109 : '000' - '999'
1110 - 11109 : '0000' - '9999'
Jadi, nilai karakter pertama dalam kode tidak hanya basis yang dinaikkan ke posisi, tetapi juga memiliki offset.
Setelah menerapkan ini ke pengkodean base-62, inilah yang saya dapatkan:
create function tiny_Encode(@UrlId int) returns varchar(10)
as
begin
declare
@Chars varchar(62),
@Code varchar(10),
@Value int,
@Adder int
set @Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
if (@UrlId < 63) begin
set @Code = substring(@Chars, @UrlId, 1)
end else begin
set @UrlId = @UrlId - 1
set @Value = 62
set @Adder = 0
while (@UrlId >= @Value * 63 + @Adder) begin
set @Adder = @Adder + @Value
set @Value = @Value * 62
end
set @Code = substring(@Chars, (@UrlId - @Adder) / @Value, 1)
set @UrlId = ((@UrlId - @Adder) % @Value)
while (@Value > 1) begin
set @Value = @Value / 62
set @Code = @Code + substring(@Chars, @UrlId / @Value + 1, 1)
set @UrlId = @UrlId % @Value
end
end
return @Code
end