2013-07-04 41 views
0

在這個情景中,我有一些經理(約150人)。他們的日常工作之一是生成50(恆定)的授權碼(6-8位數字),這些碼以其Id存儲在db中。如果使用任何授權代碼,該代碼被標記爲已使用,並且觸發器在它們已滿15天並且已被使用時將其刪除。如何生成6-8位數字的隨機數字,而不會與時間關鍵時尚的先前生成的數字相沖突?

在我的表中,我設置了授權碼作爲唯一鍵。我生成一個隨機數,然後查詢數據庫,如果它存在我生成另一個或我保存它。

除了我的邏輯檢查數據庫的存在的每一件事情都很好。這種往返+檢查導致顯着的延遲,因爲現在有超過1090083個待處理授權代碼。由於這些授權代碼處於流通狀態,因此我們無法撤銷它,並且在當前的負載情況下,需要花些時間來查找新的數字。

我需要在一個不同的邏輯中執行它,執行速度應該是使用的隨機數的方式。

我的表設計如下

slno(AUTH增量)|| auth_code(隨機碼)|| auth_by(由創建)||使用 (1 =已使用/ 0 =未使用)

+0

不要使用C#生成它,而是在數據庫中生成它。這是更高效和更安全。 –

+1

有內置的類,但追逐在那裏得到重複的數字。你將不得不保留舊的價值觀並從你自己那裏檢查。 –

+2

出於好奇,他們爲什麼要隨機?他們爲什麼不能順序?他們會是獨一無二的,更容易計算?然後根據需要簡單翻轉。 – Belogix

回答

0

最簡單的方法是生成隨機數字並生成一個新的隨機ID,如果您獲得重複。這是有效的,因爲用你的數字得到重複的可能性非常小。

如果這不能說服你,你可以考慮許多方案,從數學上保證這些數字是唯一的,而且看起來是隨機的,但它變得複雜。

+0

請給出這些計劃的鏈接,只要微積分不在場,複雜性就不會成爲問題。 – Ratna

+0

兩個例子在這裏:http://stackoverflow.com/questions/15073971/generate-random-looking-code-from-consecutive-integers – Joni

0

如果你的數據庫不支持創建唯一的ID:
- 建立一個表與由值排序及其 大小存儲和所有可用的隨機數。

  • 隨機選擇此表的一個元素。
  • 獲取後繼元素。如果後繼元素是元素的鄰居,則 接下一個後繼元素。如果您到達最後一個元素,請從步驟2中的 元素重新開始,現在轉到前一個元素。
  • 現在只需選擇一個元素下一個元素的隨機範圍,並獲得您的隨機數。
  • 準備就緒!

示例:您將所有ID存儲在已排序的表中。讓我們假設這是例如
{890,1045,2345,2346,4087}

第一步:隨機選擇其中一個。你會得到如通過C#

Random random = new Random(); 
int indexOfNumber = random.Next(0, myTableSize); 

第二步:你有索引,讓我們假設它是2.現在,在指數3獲得下一個數字,它是2346不幸的是它是一個直接的鄰居,讓你繼續指數4. 這是4087。

第三步:在這種情況下,通過

int myRandomNumber = previousElement + random.Next(1,nextElement-previousElement); 

創建您的號碼:

int myRandomNumber = 2346 + random.Next(1, 4087-2346); 

存儲新的隨機數。 有了這個,你會從數據庫中讀取大多數兩個元素(可能多一些)獨立的數據庫大小。創建兩個隨機數是不重要的。 如果您的索引處於末尾(只是顛倒搜索方向),則只能關注邊緣情況。

+0

我不能得到你在說什麼。你能舉個例子嗎?我必須將所有可能的數字保存在另一個表中嗎? – Ratna

+0

@Ratna:添加了示例。 –

0

考慮一下。如果隨機數是獨特的,並以某種(code_id, code, other_data)表格的方式存儲在一個基地中,那麼您可以在您的基地中添加一個移動表:(code, code_id)code字段被索引給予您一些不錯的logariphmycal搜索。

但是鑑於此,您也可以在第一個表中創建一個附加的鍵。只要code是獨一無二的,它會正常工作。