我的应用程序创建优惠券,每个优惠券都需要一个唯一的条形码号码。此数字必须为正整数,并且必须介于6- 12位之间。此号码代表唯一优惠券,因此此号码必须唯一。我不能简单地将条形码数字加1,因为这将使黑客很容易猜测其他优惠券条形码。
如果我有一个优惠券数据库表,我如何生成这个随机的条形码号码并保证唯一性?
发布于 2011-03-17 06:32:55
这将给你一个最多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)发布于 2011-03-17 06:29:47
这听起来可能很差劲,但是根据你需要的值的数量,你可以在列上设置一个唯一的约束,然后用一个随机数( 6-12位)来更新每一行,然后循环直到它不会失败。12位数太多了,所以你可能不会有太多的冲突。
https://stackoverflow.com/questions/5332582
复制相似问题