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

时间:2011-03-16 22:24:09

标签: sql sql-server database tsql math

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

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

2 个答案:

答案 0 :(得分:5)

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

select -convert(bigint, convert(varbinary(max), newid())) % 1000000000000

您需要测试并忽略碰撞,并丢弃最终少于6位的数字。

<小时/>

修改

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

要0-pad到12位,请使用

select right('000000000000'
      +right(-convert(bigint, convert(varbinary(max), newid())),12),12)

答案 1 :(得分:2)

可能声音很蹩脚,但根据您需要的值,您可以在列上添加一个唯一约束,并使用随机数(使用6-12位数字)更新每一行并循环直到它没有失败。 12位是很多值,所以你可能不会发生很多碰撞。