我希望創建一個簡單的短期的預訂系統,我想產生是創建一個唯一的字母數字10個字符的字符串
- 獨特
- 隨機找 確認號碼
- 字母數字
- 短十歲上下,至少要比短32字符的長字符串的SHA1返回
我只是期待有〜500保留,所以我不想象 collistan的可能性很高。
我的一個想法是基於日期時間戳和用戶名生成sha1散列,然後將其截斷爲前10個字符。這樣的事情是否足夠可靠地處理約500個預訂?
我希望創建一個簡單的短期的預訂系統,我想產生是創建一個唯一的字母數字10個字符的字符串
我只是期待有〜500保留,所以我不想象 collistan的可能性很高。
我的一個想法是基於日期時間戳和用戶名生成sha1散列,然後將其截斷爲前10個字符。這樣的事情是否足夠可靠地處理約500個預訂?
SHA-1散列的任何給定位的隨機性應該沒有區別,所以這是可能的。另一種方法是使用XOR將哈希摺疊到自身中,直到獲得60位數據,然後使用Base 64對其進行編碼以獲得大部分字母數字結果。
只有當您希望能夠爲相同的輸入數據重複生成相同的ID時,才需要這樣做。否則,如果您生成一次隨機ID,然後堅持使用安德斯的建議。如果發生衝突,只需生成另一個衝突。
這裏是做在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(); }
我不記得時間()部分是如何長,所以你可能需要調整數量以滿足您的長度。如果你不需要它,你也可以刪除那部分。
你可以使用任何東西,即使是一個普通的隨機數發生器;但是,您應該檢查預訂代碼是否已經存在。如果是這種情況,請在字符串(日期+用戶)中添加字符('x'),直到獲得新的隨機/ sha1/etc。
我只是希望有500個預約,所以我不會想象出大概的機率。
另一種愚蠢的想法:產生1000張或2000具有所需性能獨特的隨機數,存儲它們的地方,並將它們分配給用戶,因爲他們註冊:)
使用GUID? 16個字符,但如果你真的不關心碰撞,你可以選擇前n個字符。
請注意,GUID的子字符串不保證完全是唯一的http:///blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx – Eclipse 2009-01-21 23:56:33
guid算法僅保證唯一性,您不能假定生成的guid是隨機的,這是使用作爲會話ID。 – 2009-01-22 00:19:28
在這個問題上有一些很好的建議:How do I create a random alpha-numeric string in C++?
我會避免包括像 「1」, 「L」 和 「O」, 「0」 和 「5」, 「S」 和「字Z「,」2「,以便客戶在需要通過電話閱讀預訂代碼時更方便。在該鏈接中呈現的算法應該可以幫助您做到這一點。
如果它真的只有500個,那麼預先生成其中的20,000個到表中,然後在需要時獲取「下一個未使用的」。
我可以建議基地32呢?如果任何人不得不抄錄這個序列,Crockford的Base32是一個非常優越的選擇http://crockford.com/wrmg/base32.html – Breton 2009-01-22 00:06:30