幾乎所有的微薄都提供了縮短網址的服務,其原理就是將一個url地址按照一定的算法生成一段字符串,然后加在一個短域名后面邊成了一個新的url地址,數據庫中會存放這個短地址和原始的地址,當用戶點擊這個新的短地址后,短地址服務會根據短域名后面的幾個字符串從數據庫中讀出原來的地址然后頁面進行跳轉 。
比如新浪微薄中的url 是 http://t.cn/xxxxxxx t.cn是其域名 ,其后面跟著的是7位算出來的字符串。
方法一:使用哈希庫自定義算法
因為文本中顯示太長的url會比較亂,或者采用省略顯示的方式,或者采用短url的方式.
為了同時方便統計點擊數以及進行內容過濾.實現了一個生成短url值的方法.
為了防止你的hash值被破解,可以在生成md5值的時候加入你自己的salt.
這樣即便直到你的code_map也不能破解到原始url了.
為了讓結果更加隨機,把每次循環沒有使用的第二個bit保存到e里面.這樣可以讓結果沖突率更小.
#引入哈希庫
import hashlib
def get_md5(s):
s= s.encode('utf8')if isinstance(s,unicode)else s
m= hashlib.md5()
m.update(s)
return m.hexdigest()
code_map= (
'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' ,
'M' ,'N' ,'O' ,'P' ,'Q' ,'R' ,'S' ,'T' ,
'U' ,'V' ,'W' ,'X' ,'Y' ,'Z'
)
def get_hash_key(long_url):
hkeys= []
hex = get_md5(long_url)
for iin xrange(0,4):
n= int(hex[i*8:(i+1)*8],16)
v= []
e= 0
for jin xrange(0,5):
x= 0x0000003D & n
e |= ((0x00000002 & n ) >>1) << j
v.insert(0, code_map[x])
n= n >>6
e |= n <<5
v.insert(0, code_map[e &0x0000003D])
hkeys.Append(''.join(v))
return hkeys
if __name__== '__main__':
print get_hash_key('http://www.Pythontab.com')
方法二:使用libsurl庫
libsurl 是一個用來生成短URL的C和Python庫,支持 bit.ly 和 tinyurl 等短url 服務網站。