業務id轉密文短鏈的一種實現思路

2022-11-24 21:16:53 字數 967 閱讀 3883

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地址;

function shorturl($input)

$output = $out;

}return $output;

}

看了之後,真是嘖嘖稱讚,肯定就用這個思路了,但是需要稍稍改良一下,因為 這個加密後有6位,而我們要求5位,需要注意的事:要滿足不同id加密後的唯一性(其實是儘量保持低碰撞率);他的短鏈可表示的連線數為32的6次方約等於10億個,我們改成6位後至少也要可以表示這個量級。

廢話少說,修改後的演算法如下:

function shorturl($id='', $salt='')    

$output = $out;

}$in = 0x3 & (1 * ('0x'.substr($hex, 0, 1)));return $output[$in];

}