唯一碼 隨機碼
更具體的需求是這樣的
資料庫裡可能會逐漸插入不超過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;