2012-09-22 103 views
0

目前我和我的朋友正在開發一個網站,爲我們稱之爲「項目」,我們只是有一個基本的自動增加ID中用於導航到項目,如唯一的標識字符串

oururl.com/viewproject?id=1 
數據庫

但我們開始思考,如果我們有很多張貼項目這將是一個長URL。所以我們需要以某種方式隨機生成大約6個字符的字母數字字符串。我們希望字符串被複制的機會非常低,當然我們會在分配標識符之前查詢數據庫。感謝anyhelp,意味着很多!

+2

這正是你正在尋找的東西:http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/ – Tchoupi

回答

0

你總是可以使用PHP的uniqid()生成一個隨機字符串,然後用substr()修剪下來。

$unique_six_character_id = substr(uniqid(), 0, 6); 
+0

好吧,它被重複的機會是什麼? o.O – NardCake

+0

@NardCake:六個字符,16個可能的組合(0-9a-f),所以這就是16^6 = 16 777 216.儘管增加了ID,但沒有什麼問題。 –

0

試試這個:

$id = substr(md5(uniqid()), 0, 6); 
+2

爲什麼要散列唯一的ID?你正在增加碰撞的機會。這是一個壞主意。 – Brad

+0

他說他希望它是一個字母數字字符串,只是爲了增加包含字母的機會。 –

+1

這沒有意義。 – Brad

2

保持數字ID在你的數據庫的速度。使用將這些數字ID轉換爲字母數字ID的算法。

這樣,你不必擔心重複,並且你的數據庫中仍然有非常快的索引。

看到這個答案:https://stackoverflow.com/a/12479939/362536而這個問題:Tinyurl-style unique code: potential algorithm to prevent collisions

+0

我會考慮這個... – NardCake

+0

好。另外,請看Mathieu發佈的鏈接。這完全是一個概念。重點是在數據庫中保留數字索引。他們在那裏是有原因的。搜索容易,確保不會發生碰撞。用於在URL中顯示的內容可能會有所不同,並且從字母數字轉換爲數字ID的過程非常快速和簡單。不要搞亂你的數據庫只是爲了顯示。保持這些層分離。 – Brad

0

您可以使用此代碼來生成動態的6位數字....

$random = substr(number_format(time() * rand(),0,'',''),0,6); 

這裏與代碼發生什麼: 外部分「substr」用於將我們創建的隨機數減少到6個字符。您會注意到代碼段末尾的數字10,可以將其更改爲您想要的任何數字。

「number_format」函數有助於擺脫產生隨機數的科學記數法。在中間,「time()」和「rand()」相乘。 Time()是1970年1月1日以來的秒數,rand()是通過PHP生成的唯一數字。

永遠記住,生成唯一的數字並不是萬無一失的。如果您的應用程序要求每個數字都是唯一的,請在保存之前在數據庫中執行衝突檢查。

+0

這裏很難做出決定。另一個需要更多的時間,這是快速的,但沒有重複證明...:D – NardCake

+0

@Raj,'uniqid()'有效地做你正在提議的... – Brad

+0

除了'time()* rand()'比uniqid更容易產生碰撞 – Mahn