日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解

發布時間:2023/12/3 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例講述了Python實現短網址ShortUrl的Hash運算方法。分享給大家供大家參考。具體如下:

shorturl實現常見的做法都是將原始Url存儲到數據庫,由數據庫返回一個對應ID。

以下要實現的是不用數據庫支持就對原始URL進行shorturl hash。說到這里我們很容易想到MD5,固定長度,沖突概率小,但是32個字符,太長?我們以MD5為基礎,將其字符縮短,同時要保證一定數量范圍內hash不會沖突。

我們分成兩個步驟來實現。

第一步算法:

① 將長網址用md5算法生成32位簽名串,分為4段,,每段8個字符;

② 對這4段循環處理,取每段的8個字符, 將他看成16進制字符串與0x3fffffff(30位1)的位與操作,超過30位的忽略處理;

③ 將每段得到的這30位又分成6段,每5位的數字作為字母表的索引取得特定字符,依次進行獲得6位字符串;

④ 這樣一個md5字符串可以獲得4個6位串,取里面的任意一個就可作為這個長url的短url地址。

(出現重復的幾率大約是n/(32^6) 也就是n/1,073,741,824,其中n是數據庫中記錄的條數)

我們就得到了4個6位串,可是選哪個作為最終的hash結果呢,隨機選肯定是不行的,同樣的url兩次hash就會得出不同的結果。接下來根據原始url的特征進行選擇,并且將hash沖突的可能性控制在同一個domain內:

第二步算法:

①從原始url中提取域名,提取數字(最多后6位);

②將所得的數字與4取模,根據所得的余數決定從第一步算法中得到的4個shorturl中選取哪一個;

③從域名中提取特征串:一級域名中的第一個字符和后面二個輔音(如果輔音不足2個取任意前兩個);

④域名特征串和選定的shorturl拼接成9位字符為最終的shorturl;

(后兩個步驟是將沖突控制在一個domain內)

ShortUrl.py

#encoding:utf-8

__author__ = 'James Lau'

import hashlib

import re

def __original_shorturl(url):

'''

算法:

① 將長網址用md5算法生成32位簽名串,分為4段,,每段8個字符;

② 對這4段循環處理,取每段的8個字符, 將他看成16進制字符串與0x3fffffff(30位1)的位與操作,超過30位的忽略處理;

③ 將每段得到的這30位又分成6段,每5位的數字作為字母表的索引取得特定字符,依次進行獲得6位字符串;

④ 這樣一個md5字符串可以獲得4個6位串,取里面的任意一個就可作為這個長url的短url地址。

(出現重復的幾率大約是n/(32^6) 也就是n/1,073,741,824,其中n是數據庫中記錄的條數)

'''

base32 = ['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'

]

m = hashlib.md5()

m.update(url)

hexStr = m.hexdigest()

hexStrLen = len(hexStr)

subHexLen = hexStrLen / 8

output = []

for i in range(0,subHexLen):

subHex = '0x'+hexStr[i*8:(i+1)*8]

res = 0x3FFFFFFF & int(subHex,16)

out = ''

for j in range(6):

val = 0x0000001F & res

out += (base32[val])

res = res >> 5

output.append(out)

return output

def shorturl(url):

'''

算法:

①從原始url中提取域名,提取數字(最多后6位);

②將所得的數字與4取模,根據所得的余數決定從第一步算法中得到的4個shorturl中選取哪一個;

③從域名中提取特征串:一級域名中的第一個字符和后面二個輔音(如果輔音不足2個取任意前兩個);

④域名特征串和選定的shorturl拼接成9位字符為最終的shorturl;

(后兩個步驟是將沖突控制在一個domain內)

'''

match_full_domain_regex = re.compile(u'^https?:\/\/(([a-zA-Z0-9_\-\.]+[a-zA-Z0-9_\-]+\.[a-zA-Z]+)|([a-zA-Z0-9_\-]+\.[a-zA-Z]+)).*$')

match_full_domain = match_full_domain_regex.match(url)

if match_full_domain is not None:

full_domain = match_full_domain.group(1)

else:

return None

not_numeric_regex = re.compile(u'[^\d]+')

numeric_string = not_numeric_regex.sub(r'',url)

if numeric_string is None or numeric_string=='':

numeric_string = '0'

else:

numeric_string = numeric_string[-6:]

domainArr = full_domain.split('.')

domain = domainArr[1] if len(domainArr)==3 else domainArr[0]

vowels = 'aeiou0-9'

if len(domain)<=3:

prefix = domain

else:

prefix = re.compile(u'[%s]+'%vowels).sub(r'',domain[1:])

prefix = '%s%s'%(domain[0],prefix[:2]) if len(prefix)>=2 else domain[0:3]

t_shorturl = __original_shorturl(url)

t_choose = int(numeric_string)%4

result = '%s%s'%(prefix,t_shorturl[t_choose])

return result

希望本文所述對大家的Python程序設計有所幫助。

本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴

本文系統來源:php中文網

總結

以上是生活随笔為你收集整理的python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。