मैं रूपांतरण करने में कामयाब रहा। मुश्किल बात यह है कि यह केवल मिश्रित आधार रूपांतरण नहीं है, पहले वर्ण का उच्च आधार भी लंबे कोड के मूल्यों को प्रभावित करता है।
मैंने एक आसान मामले से शुरुआत की; बेस -10 कोड। मैंने देखा कि दो अंकों की श्रेणी में 10 अतिरिक्त कोड हैं, तीन अंकों की श्रेणी में 100 अतिरिक्त कोड हैं, और इसी तरह:
0 - 9 : '0' - '9'
10 - 109 : '00' - '99'
110 - 1109 : '000' - '999'
1110 - 11109 : '0000' - '9999'
इसलिए, कोड में पहले वर्ण का मान न केवल स्थिति के लिए उठाया गया आधार है, बल्कि इसकी एक ऑफसेट भी है।
बेस -62 एन्कोडिंग में इसे लागू करने के बाद, मैंने यही समाप्त किया:
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