2012-05-23 25 views
1

我想能夠形成產生6字符確認代碼的算法(例如A1JU2Z),這將是對於給定的(用戶代碼)對是唯一的。原因是,我想將代碼保留在6個字符處,但使用修整後的字母數字組合(以避免與1和I等混淆)僅在發生衝突之前允許約3億個代碼。當然,我可能永遠不需要3億個代碼,但如果我這樣做,回去修復它將是一個巨大的痛苦。生成用戶唯一的6個字符的確認碼的算法?

那麼,有沒有利用用戶的方式......說他們的用戶名,以通用的唯一代碼,例如,如果同一個用戶希望生成另一個代碼,其保證這是他們獨特之處? (當然,這是假定單個用戶不產生超過300磨機碼)

謝謝!

+0

凡不_code_了'(用戶代碼)'對來自哪裏? – Attila

+0

@Attila - 我可能會寫這個不好,但基本上我想能夠使用用戶的用戶名(例如)+一些其他序列生成代碼。所以全球唯一的(用戶名,確認碼)對。 – Peter

+0

我認爲用戶名+確認碼總是超過6個字符。 – djleop

回答

0

我認爲你可以使用這樣一個簡單的密碼生成器:http://www.webtoolkit.info/php-random-password-generator.html

聯合檢查算法,以確保它尚未使用。

$pass=generate_password(); 
$found=find_password($pass); 
while($found){ 
    $pass=generate_password(); 
    $found=find_password($pass); 
} 
save_password($user,$code,$pass); 

generate_password()是鏈接中引用的函數。 find_password()是您必須編寫的函數,用於檢查數據庫中已經生成的代碼。 save_password()是您必須編寫的函數,以將生成的代碼存儲在數據庫中。

的代碼在PHP,但邏輯是在這裏。 鏈接中的密碼生成器很容易理解,您可以使用所需的字符規則獲得6個字符的長度。

+0

嗨,我想避免「確保它不被使用」的一步。基本上我需要一種算法/數學方法來爲用戶生成一個唯一的代碼作爲該用戶的用戶名的函數。 – Peter

+0

所以你正在尋找一個哈希算法(md5,sha1)。有6個字符,碰撞風險很大。最簡單的方法是從md5或其他散列算法結果中獲取6個字符。 – djleop

1

如果ID是唯一僅對當前用戶,你可以直接生成ID的每個字符隨機。只要不希望用戶生成大量這樣的ID,您將有合理的機會不會多次生成相同的ID(您需要進行一些數學計算以獲得確切的碰撞機會數字,因爲生成的ID數量增長)。

如果不能不惜一切代價有碰撞,你需要或者保留所有先前生成的ID,並做了新的比較,或者保持生成的ID的數量(這需要一個方案,其中ID一代是確定的基礎上,計數,而且獨特的 - 一個非常簡單的例子是{ID=count; ++count;}