2017-02-06 19 views
0

我需要一個字符串,最大長度爲6,數字和字母組合。我查了一下:在php中使用base_convert創建唯一字符串並限制長度

How can I make short random unique keys, like YouTube video IDs, in PHP?

PHP generate a unique string

,這是非常有用的,但他們做的字符串長度爲10 - 12我的問題是,這個代碼的輸出始終是唯一的或不?

base_convert(microtime(false), 6, 36); 

base_convert(uniqid('test',true), 6, 36); 

注意:我從基地6轉換但是輸入顯然不會是基地6.我這樣做是因爲,如果從10轉換爲36它產生10- 12長度。

+0

我不認爲這會工作,因爲你試圖從基地6轉換,但輸入顯然不會是基地6 – apokryfos

+0

@apokryfos 是的,我這樣做。我這樣做,因爲如果我從10轉換到36它產生10-12長度。 我該怎麼辦? –

+0

但基數6意味着數字將全部在0-5之間,但情況並非如此。你應該做一個['substr'](http://php.net/manual/en/function.substr.php) – apokryfos

回答

1

簡答:不,但是如果你正在做一些像個人網站一樣小的東西,或者只有很少的人使用的內部工具,那麼它會好的。

長答案:絕對不是,如果你想要做一些安全的事情,或者使用多個共享數據庫的服務器。攻擊者可以計算出請求到達服務器所需的時間,並根據請求對請求進行轟擊,直到服務器根據microtime生成重複的ID。 uniqid函數不能保證返回uniq值(直接從PHP手冊),並且如果您使用NTP更新您的時間並且它將您的時間調整爲5秒前,肯定會生成重複的ID。

+0

我該如何做得更好? –

+0

使獨特的東西最簡單的方法是與計數器進行原子操作。最簡單的方法是使用SQL數據庫,並依靠自動增加的ID,因爲它們已經處理了所有可能的事情。如果你不想使用數據庫,你可以在文件系統上創建一個文件來存儲一個簡單的整數。您將需要實現獨佔文件鎖定,鎖定等待和鎖定釋放。閱讀http://php.net/manual/en/function.flock.php – Dimi