我的应用程序创建优惠券,每张优惠券都需要一个唯一的条形码编号。此数字必须是正整数,并且必须介于 6 - 12 位数字之间。这个数字代表一张唯一的优惠券,所以这个数字必须是唯一的。我不能简单地将条形码数字加 1,因为这将使黑客很容易猜出其他优惠券条形码。
如果我有一个优惠券数据库表,我如何生成这个随机条码编号并保证唯一性?
最佳答案
这将为您提供最多 12 位数字的随机数,并且几乎没有冲突。
select -convert(bigint, convert(varbinary(max), newid())) % 1000000000000
您需要测试并忽略冲突,并丢弃结尾少于 6 位的数字。
编辑
要首先使用最短的长度,您将无法使用真正的随机数生成器。这是因为一旦达到 6 位数范围的 95%,冲突就会非常高,以至于程序将所有时间都花在尝试和重试上,以获取尚未使用的唯一数字。一旦你只剩下一个数字,程序就可以永远等待并且永远不会“生成”那个数字。因此,为了实现“最低长度优先”,您实际上必须将所有数字生成到一个表中,然后随机生成行号(order by len(num), newid()
)它们,然后按顺序绘制它们出。
要将 0 填充到 12 位数字,请使用
select right('000000000000'
+right(-convert(bigint, convert(varbinary(max), newid())),12),12)
关于sql - 在数据库列中生成唯一的随机整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5332582/