2009-01-21 122 views
7

我希望創建一個簡單的短期的預訂系統,我想產生是創建一個唯一的字母數字10個字符的字符串

  • 獨特
  • 隨機找
  • 確認號碼
  • 字母數字
  • 短十歲上下,至少要比短32字符的長字符串的SHA1返回

我只是期待有〜500保留,所以我不想象 collistan的可能性很高。

我的一個想法是基於日期時間戳和用戶名生成sha1散列,然後將其截斷爲前10個字符。這樣的事情是否足夠可靠地處理約500個預訂?

回答

4

SHA-1散列的任何給定位的隨機性應該沒有區別,所以這是可能的。另一種方法是使用XOR將哈希摺疊到自身中,直到獲得60位數據,然後使用Base 64對其進行編碼以獲得大部分字母數字結果。

只有當您希望能夠爲相同的輸入數據重複生成相同的ID時,才需要這樣做。否則,如果您生成一次隨機ID,然後堅持使用安德斯的建議。如果發生衝突,只需生成另一個衝突。

+2

我可以建議基地32呢?如果任何人不得不抄錄這個序列,Crockford的Base32是一個非常優越的選擇http://crockford.com/wrmg/base32.html – Breton 2009-01-22 00:06:30

2

這裏是做在Perl一種方式:

sub get_random_name() 
{ 
    my @chars=('a'..'z','A'..'Z'); 
    my $random_string;

foreach (1..22) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[rand @chars]; } return $random_string . "-" . time(); }

我不記得時間()部分是如何長,所以你可能需要調整數量以滿足您的長度。如果你不需要它,你也可以刪除那部分。

3

你可以使用任何東西,即使是一個普通的隨機數發生器;但是,您應該檢查預訂代碼是否已經存在。如果是這種情況,請在字符串(日期+用戶)中添加字符('x'),直到獲得新的隨機/ sha1/etc。

我只是希望有500個預約,所以我不會想象出大概的機率。

另一種愚蠢的想法:產生1000張或2000具有所需性能獨特的隨機數,存儲它們的地方,並將它們分配給用戶,因爲他們註冊:)

0

使用GUID? 16個字符,但如果你真的不關心碰撞,你可以選擇前n個字符。

+0

請注意,GUID的子字符串不保證完全是唯一的http:///blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx – Eclipse 2009-01-21 23:56:33

+0

guid算法僅保證唯一性,您不能假定生成的guid是隨機的,這是使用作爲會話ID。 – 2009-01-22 00:19:28

1

在這個問題上有一些很好的建議:How do I create a random alpha-numeric string in C++?

我會避免包括像 「1」, 「L」 和 「O」, 「0」 和 「5」, 「S」 和「字Z「,」2「,以便客戶在需要通過電話閱讀預訂代碼時更方便。在該鏈接中呈現的算法應該可以幫助您做到這一點。

2

如果它真的只有500個,那麼預先生成其中的20,000個到表中,然後在需要時獲取「下一個未使用的」。

相關問題