求一個設計思路:如何產生一個唯一的8位的看起來像是隨機字母的 碼 .內詳

來源:互聯網
上載者:User
唯一碼 隨機碼

更具體的需求是這樣的

資料庫裡可能會逐漸插入不超過10w條記錄,想加一個欄位,每一條記錄的這個欄位的值 都是一個8位的碼

1.看起來像是隨機碼 比如DLKPOWND OUICHGEB 等等
2.不能被"輕易"破解 比如id=1 對應AAAAAAAA id=2對應 AAAAAAAB 當然這個描述可能跟第一條有所重複 反正就是要對方沒法輕易猜到一個碼進行尋找就能查到結果(10W條對應2088億種可能,如果只是靠猜基本上無法命中).
3.希望能在這條記錄插入輸入庫之前就獲得這樣一個碼並且不需要去檢索資料庫是否已存在.這一條可能我描述的不夠清楚,是這樣的:事實上我可以用substr(rand(0,25),1,$str)迴圈八次來產生一個碼,然後去資料庫尋找,如果還沒有的話,就插入,這樣也是唯一的. 但是這是最後的選擇,更希望能像MD5那樣傳入時間戳記就能產生一個唯一的而非去通過檢索資料庫來判斷是否唯一. 時間戳記只是個舉例不一定非要用時間戳記做種子

大致就是這樣,如果沒說明白可以提出來我再補充.求指點下思路或者給出方法~~謝謝


回複討論(解決方案)

最多10萬條?
也就是說自增的id為1到99999了
按5位補齊前置的0,即 00001到99999
在其後附加個位(當然是你指定的)為 000011 到 999999
然後做 base64 編碼

echo base64_encode('000011'), PHP_EOL;echo base64_encode('999999'), PHP_EOL;/*MDAwMDExOTk5OTk5*/
必要的話,在對結果做一下“凱撒加密”(字典移位)
自增id是唯一的,所以得到字串也是唯一的
演算法應該算是很簡單的

用自增ID做種子是很不錯的選擇,因為它10w的範圍內是唯一的 而截取八位後的目前時間戳不是

但是這樣是不是也要先存入,拿到ID酸楚碼再更新至資料庫? 能否查資料庫或者寫資料庫之前拿到碼 或者在insert的時候插入符合要求的碼

既然是變形自增id,也就沒有必要存到庫中了吧?
做一下逆運算不就還原了嗎?

用自增ID做種子是很不錯的選擇,因為它10w的範圍內是唯一的 而截取八位後的目前時間戳不是

但是這樣是不是也要先存入,拿到ID酸楚碼再更新至資料庫? 能否查資料庫或者寫資料庫之前拿到碼 或者在insert的時候插入符合要求的碼

base64_encode(base_convert(time(), 10, 36));
把目前時間轉化為36進位(8位元),在用base64_encode加密可以不,確保唯一了,也不用查資料庫。

用時間也是一個辦法,不過光 time 是不行的。
誰能保證兩個請求不在同一秒鐘內得到響應呢?
或許這樣可行
echo base_convert(str_replace('.', '', $_SERVER['REQUEST_TIME_FLOAT']), 10, 36);
但精確到毫秒,對於高效能的伺服器可能還是個問題

define('ONLY','FDSAR2432FDS');
echo base64_encode(ONLY.'000011'), PHP_EOL;
echo base64_encode(ONLY.'999999'), PHP_EOL;

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.