業務場景:
買家通過電商app下單后,會受到一條短信,短信內容中包括改訂單詳情頁面的h5地址連接,因為是出現在短信中,所以對連接有要求:1.盡量短;2.安全性考慮,訂單在數據庫中對應的自增主鍵id不能暴露出來;3. url中id加密串位數要固定
解決思路:
-
要滿足第2條要求,肯定是要對id進行某種加密后來展現到url中,其實方法有很多,可以通過把10進制id轉為高進制(比如36進制)串;也可以直接對id進行md5加密。但是轉換高進制的方式會位數不固定,這樣不符合第3個條件。直接md5加密太長不滿足條件2。鑒于此,要繼續往下深入思考一下了
-
在搜索引擎如此發達的時代,如果什么事情都想著自己去原創,那樣會顯得太傻,于是,當你當前所能想出的方案不能解決問題時候,那就去度娘或者谷歌吧
-
于是去度娘敲下“微博短鏈”,深深可以借鑒,先粘上微博中url短鏈算法思路及代碼如下:
-
將長網址md5生成32位簽名串,分為4段,每段8個字節;
-
對這四段循環處理,取8個字節,將他看成16進制串與0x3fffffff(30位1)與操作,即超過30位的忽略處理;
-
這30位分成6段,每5位的數字作為字母表的索引取得特定字符,依次進行獲得6位字符串;
-
總的md5串可以獲得4個6位串;取里面的任意一個就可作為這個長url的短url地址
1 function shortUrl($id='', $salt='') { 2 $base64 = array ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'l', 'm', 'n', 'o', 'p','q', 'r', 's', 't', 'u', 'v', 'w', 'x','y', 'z', '0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'A', 'B', 'C', 'D','E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 3 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 4 'U', 'V', 'W', 'X', 'Y', 'Z' ); 5 $hex = md5($id.$salt); 6 $hexLen = strlen($hex); 7 $subHexLen = $hexLen / 8; 8 $output = array(); 9 for ($i = 0; $i < $subHexLen; $i++) { 10 $subHex = substr ($hex, $i * 8, 8); 11 $int = 0x3FFFFFFF & (1 * (filter_var('0x'.$subHex, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX))); 12 $out = ''; 13 for ($j = 0; $j < 5; $j++) { 14 $val = 0x0000003F & $int; 15 $val = $val % 62; 16 $out .= $base64[$val]; 17 $int = $int >> 6; 18 } 19 $output[] = $out; 20 } 21 $in = 0x3 & (1 * (filter_var('0x'.substr($hex, 0, 1), FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX))); 22 return $output[$in]; 23 }
?