生成唯一随机数

时间:2014-10-02 20:57:35

标签: c# sql-server ado.net

我知道有类似的问题,但我的情况有不同的情况。

我有一个SQL Server数据库,它将存储TicketNumber和其他详细信息。此TicketNumber是从C#程序中随机生成的,该程序将传递到数据库并存储在那里。 TicketNumber必须是唯一的,可以是000000000-999999999。

目前,我所做的是:我将执行一个select语句来查询数据库中的所有现有TicketNumber:

Select TicketNumber from SomeTable

之后,我会将所有TicketNumber加载到List

List<int> temp = new List<int>();
//foreach loop to add all numbers to the List
Random random = new Random();
int randomNumber = random.Next(0, 1000000000);
if !(temp.Contain(randomNumber))
//Add this new number to the database

上面的代码没有问题,但是,当数据集变大时,性能会下降。 (我现在接近十万条记录)。我想知道是否有更有效的方法来处理这个问题?

我可以从C#应用程序或SQL Server端执行此操作。

2 个答案:

答案 0 :(得分:5)

此答案假设您无法更改要求。如果你可以使用hi / lo方案来生成不随机的唯一ID,那就更好了。

我假设您已将此设置为数据库中的主键。鉴于您已经获得了数据库中的信息,因此将其提取给客户端也没什么意义(IMO)。如果您拥有多个客户端(这似乎很可能 - 如果现在不是将来那样),那就更加充实了。

相反,只需尝试插入带有随机ID的记录。如果它工作,太棒了!如果没有,请生成一个新的随机数,然后重试。

1000天后,您将拥有一百万条记录,因此大约千分之一的插入将失败。这一天只有一个 - 除非你对插入时间有一些硬限制,这对我来说似乎很合理。

编辑:我刚刚想到了另一个解决方案,它会占用大量存储空间,但可能会非常合理......否则创建一个包含两列的表:

NaturalID ObfuscatedID

预先填充十亿行,您通过基本上洗牌所有可能的票证ID来生成这些行。这可能需要一段时间,但这只是一次性费用。

现在,您可以为故障单表使用自动递增ID,然后在填充时将相应的模糊ID复制到表中,或者在需要故障单ID时加入其中。

答案 1 :(得分:0)

您可以创建仅包含一列的单独表格。让我们暂时将它命名为UniqueID。使用UniqueID = 000000000-999999999填充该列。每次要生成随机数时,请执行

之类的操作
SELECT TOP 1 UniqueID From (Table) WHERE UniqueID NOT IN (SELECT ID FROM (YOUR TABLE))

代码尚未经过测试,只是为了表明这个想法