簡體   English   中英

產生唯一的隨機數

[英]Generate Unique Random Number

我知道有人問過類似的問題,但是在這里我有一個截然不同的情況。

我有一個SQL Server數據庫,它將存儲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端執行此操作。

該答案假設您無法更改要求。 如果您可以使用高/低方案生成不是隨機的唯一ID,那會更好。

我假設您已經將此設置為數據庫中的主鍵。 既然您已經在數據庫中獲取了信息,那么將其提取給客戶端也就毫無意義(IMO)。 如果您有多個客戶,這可能會翻倍(這似乎很有可能-如果不是現在,那么將來)。

相反,只需嘗試插入具有隨機ID的記錄。 如果有效,那就太好了! 如果不是,請生成一個新的隨機數,然后重試。

1000天后,您將擁有一百萬條記錄,因此大約每千個插入中會有一個失敗。 一天只有一天-除非您對插入時間有一定的限制,對我來說這似乎很合理。

編輯:我剛剛想到了另一個解決方案,這將需要大量的存儲,但否則可能會很合理...創建一個具有兩列的表:

NaturalID ObfuscatedID

用十億行預填充該行,您基本上是通過對所有可能的票證ID進行改組而生成的。 這可能需要一段時間,但是這是一次性的費用。

現在,您可以為票證表使用自動遞增的ID,然后在填充時將對應的混淆ID復制到表中,或者在需要票證ID時加入其中。

您可以僅創建一列來創建單獨的表。 現在暫時將其命名為UniqueID。 用UniqueID = 000000000-999999999填充該列。 每當您要生成隨機數時,請執行以下操作

SELECT TOP 1 UniqueID From (Table) WHERE UniqueID NOT IN (SELECT ID FROM (YOUR TABLE))

代碼尚未經過測試,僅用於說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM