不少時候咱們須要用 token 來做爲一些標識, 好比: 一個用戶登陸後的認證標識.segmentfault
$v = 1; // 本身定義的 須要hash 的value 值 $key = mt_rand(); // 這裏用 隨機串做爲key $hash = md5($key . $v . mt_rand() . time()); echo $hash;
執行結果: b63426a38f86b726ce0d327d48e47376
看着不是很舒服, 做爲強迫症的我 是受不了的.微信
$v = 1; $key = mt_rand(); $hash = md5($key . $v . mt_rand() . time()); $token = base64_encode($hash); echo $token;
執行結果: MWQyMjE2NmI3NDA1MmRjZTQwOTQzZDZjMWU1OTE5OGU=
看着稍微舒服些了, 可是還不夠好, 反觀微信的 openid , 通常是不會有後面的 = 號的優化
優化url
$v = 1; $key = mt_rand(); $hash = md5($key . $v . mt_rand() . time()); $token = str_replace('=', '', base64_encode($hash)); echo $token;
執行結果: Yzg4MWU0OTQ0MTRiZTI0YWYwMDJjOTYyODBkNjFmMTM
這下沒有 = 號了, 舒服了些, 可是又太長了, 微信的 openid 可沒這麼長code
換種 hash 試試
$v = 1; $key = mt_rand(); $hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true); $token = str_replace('=', '', base64_encode($hash)); echo $token;
執行結果: 7pn0pWzO+/TOoISNtDaewa4CyuXw
是短些了, 但是裏面有 +/ 號, 不少狀況下用 get 傳遞時會被 urlcode, urlcode 事後就這樣了 7pn0pWzO%2b%2fTOoISNtDaewa4CyuXw
, 這顯然不是咱們想要的token
繼續優化
$v = 1; $key = mt_rand(); $hash = hash_hmac("sha1", $v . mt_rand() . time(), $key, true); $token = str_replace('=', '', strtr(base64_encode($hash), '+/', '-_')); echo $token;
執行結果: JM9AkY7SAIROrJ7fhjIU2ApbMsI
這下不會 urlcode了, 看着也舒服些了, 我目前是這樣用的...md5
目前沒發現什麼更好的方案, 只是說出了我認爲的比較好的方案get
Vue-cli3.0 + Element UI + ThinkPHP5.1 + RBAC權限 + 響應式的後臺管理系統hash