我正在寻找一种方法来生成独特的随机ID,它们可以通过代码或使用MSSQL(最好)尽可能短(类似于url shorteners)。
我知道这可以使用NEWID或CRYPT_GEN_RANDOM()完成,但这些方法只使用AF和0-9,而我正在寻找一个使用所有62个字符(AZ,az,0-9)的解决方案,因此获得一个更短的身份证。
我不能说这是适合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)
~ = 916百万的独特组合。但是,您可能希望增加代码长度以使其更难猜测。这就是为什么我的样本生成7个字符的代码 - 对于使用的1亿个组合,它将为每个实际生成的组合提供大约35000种可能的组合。
另一方面,如果可猜测性不是您的问题,您可以将代码的长度保持在最小值,在您的情况下为5个字符。