幾乎所有的微薄都提供了縮短**的服務,其原理就是將乙個url位址按照一定的演算法生成一段字串,然後加在乙個短網域名稱後面邊成了乙個新的url位址,資料庫中會存放這個短位址和原始的位址,當使用者點選這個新的短位址後,短位址服務會根據短網域名稱後面的幾個字串從資料庫中讀出原來的位址然後頁面進行跳轉程式設計客棧 。
比如新浪微薄中的url 是 t.cn是其網域名稱 ,其後面跟著的是7位算出來的字串。
方法一:使用雜湊庫自定義演算法
因為文字中顯示太長的url會比較亂,或www.cppcns.com者採用省略顯示的方式,或者採用短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' , 'slrvcrsyq' , '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 i in xrange(0, 4):
n = int(hex[i*8:(i+1)*8], 16)
v =
e = 0
for j in xrange(0, 5):
x = 0x0000003d & n
lrvcrsyq e |= ((0x00000002 & n ) >> 1) << j
v.insert(0, code_map[x])
n = n >> 6
e |= nlrvcrsyq << 5
v.insert(0, code_map[e & 0x0000003d])
hkeys.append(''.join(v))
return hkeys
if __name__ == '__main__':
print get_hash_key('')
方法二:使用libsurl庫
libsurl 是乙個用來生成短url的c和python庫,支援 bit.ly 和 tinyurl 等短url 服務**。
本文位址:
5 4使用routing生成URL
使用routing生成url url生成器概述 1 質詢每個路由表 2 匹配返回結果 url生成器詳細工作方式 1 呼叫routecollection.getvirtualpath 2 匹配引數 3 匹配預設引數 使用命名路由 非指定變數的匹配 route.maproute null,todo ne...
thinkphp 使用U方法自動生成URL超連結
u 方法是 thinkphp 內建的乙個快捷方法,可以根據系統 url 模式配置動態的生成智慧型的 url 位址。由於 thinkphp 支援各種不同的 url 模式,另外還有分組模式,因此當環境發生變化時,有時候可能會改變 url 模式,而 u 方法正是解決不同配置情況下的 url 統一問題。除了...
小工具 使用Python自動生成MD風格鏈結
很久之前我在github上搞了乙個leetcode的倉庫,但一直沒怎麼維護。最近發現自己刷了不少lc的題目了,想搬運到這個倉庫上。玩github最重要的當然是寫readme了,md的逼格決定了專案牛逼不牛逼。但是讓我乙個乙個去手寫專案中的鏈結那是不可能的,這輩子都不可能手寫,只有寫指令碼自動生成才能...