代码之家  ›  专栏  ›  技术社区  ›  Guffa

多基地转换-使用所有组合的网址缩写

  •  1
  • Guffa  · 技术社区  · 14 年前

    我使用字符0-9,A-Z,A-Z,所以它基本上是一个base-62编码。这是相当基本的,但它并没有利用所有可能的代码。它将产生的代码是:

    0, 1, ... y, z, 10, 11, ... zy, zz, 100, 101, ...
    

    请注意,代码00到0z未使用,000到0zz使用相同的代码,以此类推。我想使用所有代码,如下所示:

    0, 1, ... y, z, 00, 01, ... zy, zz, 000, 001, ...
    

    这将是基地-62和基地-63的一些组合,不同的基地取决于位置。。。使用base-62很简单,例如:

    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
    

    但我还没有成功地将它转换成多基,以利用所有的代码。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Guffa    14 年前

    我成功地完成了转换。棘手的是,它不仅仅是一个混合基转换,第一个字符的高基也会影响较长代码的值。

    我从一个简单的案子开始;10进制代码。我看到两位数的范围有10个额外的代码,三位数的范围有100个额外的代码,以此类推:

    0 - 9        : '0' - '9'
    10 - 109     : '00' - '99'
    110 - 1109   : '000' - '999'
    1110 - 11109 : '0000' - '9999'
    

    因此,代码中第一个字符的值不仅是提升到该位置的基,而且还有偏移量。

    在将其应用于base-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
    
    推荐文章