在数据库列中生成唯一的随机整数

Dan*_*itt 5 sql t-sql database sql-server math

我的应用程序创建了每个需要唯一条形码编号的优惠券.此数字必须是正整数,且必须介于6到12位之间.此号码代表唯一的优惠券,因此该号码必须是唯一的.我不能简单地将条形码数量增加1,因为这样可以让黑客轻松猜出其他优惠券条形码.

如果我有优惠券数据库表,我该如何生成这个随机条形码编号并保证唯一性?

Ric*_*iwi 5

这将为您提供最多12位数的随机数,几乎没有碰撞.

select -convert(bigint, convert(varbinary(max), newid())) % 1000000000000
Run Code Online (Sandbox Code Playgroud)

您需要测试并忽略冲突,并丢弃最终少于6位的数字.


编辑

要首先使用最低长度,您将无法使用真正的随机数生成器.这是因为一旦达到6位数范围的95%,冲突就会如此之高,以致程序花费所有时间尝试并重试获取尚未使用的唯一编号.一旦你只剩下一个数字,程序可以永远等待,永远不会"生成"那个数字.因此,要实现"最低长度优先",您实际上必须将所有数字生成到表中,然后order by len(num), newid()随机排列(),然后依次绘制它们.

要使用0到12位数,请使用

select right('000000000000'
      +right(-convert(bigint, convert(varbinary(max), newid())),12),12)
Run Code Online (Sandbox Code Playgroud)