-2

我正在寻找一种通过代码或使用 MSSQL(首选)生成尽可能短的唯一随机 id 的方法(类似于 url 缩短器)。

我知道这可以使用 NEWID 或 CRYPT_GEN_RANDOM() 来完成,但这些方法仅使用 AF 和 0-9,而我正在寻找一种将使用所有 62 个字符(AZ、az、0-9)的解决方案,因此获得短得多的身份证。

4

1 回答 1

0

我不能说这对 SQL Server 来说是一个合适的任务,但它仍然是可以实现的。

首先,您需要创建包含您希望在 URL 中看到的所有字符的映射表:

declare @charmap table (
  Id tinyint identity(0,1) primary key,
  Letter char(1) collate Latin1_General_BIN not null unique
);

insert into @charmap (Letter)
select top (26) char(row_number() over(order by (select null)) - 1 + ascii('A'))
from sys.all_objects ao
union all
select top (26) char(row_number() over(order by (select null)) - 1 + ascii('a'))
from sys.all_objects ao
union all
select top (10) char(row_number() over(order by (select null)) - 1 + ascii('0'))
from sys.all_objects ao;

在这个例子中,我使用了一个表变量来最小化影响。当然,您可以将其变成静态表格;在这种情况下,它只需要填充一次。

现在,以下查询将生成指定数量的代码,所有代码都具有相同的所需长度。前两个变量控制:

declare @BatchSize int = 1000,
  @Length int = 7;

select h.RndHex,
  replace(
    (select cm.Letter as [data()] from (
      select top (datalength(h.RndHex)) row_number() over(order by (select null)) as [RN]
      from sys.all_objects ao
    ) ca
    inner join @charmap cm on cm.Id = cast(substring(h.RndHex, ca.RN, 1) as tinyint) % 62
    order by ca.RN
    for xml path('')
    ), ' ', ''
  ) as [ShortURL]
from (
  select top (@BatchSize) crypt_gen_random(@Length) as [RndHex]
  from sys.all_objects a, sys.all_objects o
) h;

从技术上讲,5 个字符将为您提供power(62., 5)~=9.16 亿个独特的组合。但是,您可能希望增加代码长度以使它们更难猜测。这就是为什么我的示例会生成 7 个字符的代码 - 对于使用的 1 亿个组合,它将为每个实际生成的组合提供大约 35000 个可能的组合。

另一方面,如果可猜测性对您来说不是问题,您可以将代码的长度保持在最低限度,在您的情况下为 5 个字符。

于 2019-03-27T09:35:29.390 回答