生成唯一随机数

C.J*_*.J. 0 c# sql-server ado.net

我知道有类似的问题,但我在这里有一个相当不同的场景.

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

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

Select TicketNumber from SomeTable
Run Code Online (Sandbox Code Playgroud)

之后,我将所有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
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 5

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

我假设你已经将它设置为数据库中的主键.鉴于您已经获得了数据库中的信息,因此将其提取到客户端也没什么意义(IMO).如果您有多个客户端(这似乎很可能 - 如果现在不是将来那么),那么这个数字会增加一倍.

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

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

编辑:我刚刚想到了另一个解决方案,它需要一堆存储,但可能是非常合理的,否则......创建一个包含两列的表:

NaturalID ObfuscatedID
Run Code Online (Sandbox Code Playgroud)

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

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