欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現(xiàn)短網(wǎng)址ShortUrl的Hash運算實例講解

 更新時間:2015年08月10日 15:48:37   作者:水熊寶寶  
這篇文章主要介紹了Python實現(xiàn)短網(wǎng)址ShortUrl的Hash運算,較為詳細的分析了Python短網(wǎng)址運算的算法原理與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下

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

shorturl實現(xiàn)常見的做法都是將原始Url存儲到數(shù)據(jù)庫,由數(shù)據(jù)庫返回一個對應(yīng)ID。

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

我們分成兩個步驟來實現(xiàn)。

第一步算法:

① 將長網(wǎng)址用md5算法生成32位簽名串,分為4段,,每段8個字符;
② 對這4段循環(huán)處理,取每段的8個字符, 將他看成16進制字符串與0x3fffffff(30位1)的位與操作,超過30位的忽略處理;
③ 將每段得到的這30位又分成6段,每5位的數(shù)字作為字母表的索引取得特定字符,依次進行獲得6位字符串;
④ 這樣一個md5字符串可以獲得4個6位串,取里面的任意一個就可作為這個長url的短url地址。
(出現(xiàn)重復(fù)的幾率大約是n/(32^6) 也就是n/1,073,741,824,其中n是數(shù)據(jù)庫中記錄的條數(shù))

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

第二步算法:

①從原始url中提取域名,提取數(shù)字(最多后6位);
②將所得的數(shù)字與4取模,根據(jù)所得的余數(shù)決定從第一步算法中得到的4個shorturl中選取哪一個;
③從域名中提取特征串:一級域名中的第一個字符和后面二個輔音(如果輔音不足2個取任意前兩個);
④域名特征串和選定的shorturl拼接成9位字符為最終的shorturl;
(后兩個步驟是將沖突控制在一個domain內(nèi))

ShortUrl.py

#encoding:utf-8
__author__ = 'James Lau'
import hashlib
import re
def __original_shorturl(url):
  '''
  算法:
  ① 將長網(wǎng)址用md5算法生成32位簽名串,分為4段,,每段8個字符;
  ② 對這4段循環(huán)處理,取每段的8個字符, 將他看成16進制字符串與0x3fffffff(30位1)的位與操作,超過30位的忽略處理;
  ③ 將每段得到的這30位又分成6段,每5位的數(shù)字作為字母表的索引取得特定字符,依次進行獲得6位字符串;
  ④ 這樣一個md5字符串可以獲得4個6位串,取里面的任意一個就可作為這個長url的短url地址。
  (出現(xiàn)重復(fù)的幾率大約是n/(32^6) 也就是n/1,073,741,824,其中n是數(shù)據(jù)庫中記錄的條數(shù))
  '''
  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中提取域名,提取數(shù)字(最多后6位);
  ②將所得的數(shù)字與4取模,根據(jù)所得的余數(shù)決定從第一步算法中得到的4個shorturl中選取哪一個;
  ③從域名中提取特征串:一級域名中的第一個字符和后面二個輔音(如果輔音不足2個取任意前兩個);
  ④域名特征串和選定的shorturl拼接成9位字符為最終的shorturl;
  (后兩個步驟是將沖突控制在一個domain內(nèi))
  '''
  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程序設(shè)計有所幫助。

相關(guān)文章

  • seaborn繪制雙變量聯(lián)合分布圖示例詳解

    seaborn繪制雙變量聯(lián)合分布圖示例詳解

    這篇文章主要為大家介紹了seaborn繪制雙變量聯(lián)合分布圖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Python中的lambda和apply用法及說明

    Python中的lambda和apply用法及說明

    這篇文章主要介紹了Python中的lambda和apply用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python 如何將帶小數(shù)的浮點型字符串轉(zhuǎn)換為整數(shù)

    python 如何將帶小數(shù)的浮點型字符串轉(zhuǎn)換為整數(shù)

    在python中如何實現(xiàn)將帶小數(shù)的浮點型字符串轉(zhuǎn)換為整數(shù)呢?今天小編就為大家介紹一下解決方案,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 基于python 字符編碼的理解

    基于python 字符編碼的理解

    下面小編就為大家?guī)硪黄趐ython 字符編碼的理解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Python學(xué)習(xí)工具jupyter notebook安裝及用法解析

    Python學(xué)習(xí)工具jupyter notebook安裝及用法解析

    這篇文章主要介紹了Python學(xué)習(xí)工具jupyter notebook安裝及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • python將數(shù)據(jù)插入數(shù)據(jù)庫的代碼分享

    python將數(shù)據(jù)插入數(shù)據(jù)庫的代碼分享

    在本篇文章里小編給大家整理的是關(guān)于python將數(shù)據(jù)插入數(shù)據(jù)庫的代碼內(nèi)容,有興趣的朋友們可以參考下。
    2020-08-08
  • python numpy中setdiff1d的用法說明

    python numpy中setdiff1d的用法說明

    這篇文章主要介紹了python numpy中setdiff1d的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python判斷字符串是否為合法標示符操作

    Python判斷字符串是否為合法標示符操作

    這篇文章主要介紹了Python判斷字符串是否為合法標示符操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Numpy如何檢查數(shù)組全為零的幾種方法

    Numpy如何檢查數(shù)組全為零的幾種方法

    本文主要介紹了Numpy如何檢查數(shù)組全為零的幾種方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Python?matplotlib繪圖時使用鼠標滾輪放大/縮小圖像

    Python?matplotlib繪圖時使用鼠標滾輪放大/縮小圖像

    Matplotlib是Python程序員可用的事實上的繪圖庫,雖然它比交互式繪圖庫在圖形上更簡單,但它仍然可以一個強大的工具,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib繪圖時使用鼠標滾輪放大/縮小圖像的相關(guān)資料,需要的朋友可以參考下
    2022-05-05

最新評論