本文实例讲述了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运算实例讲解相关推荐

  1. python数组赋值_对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解 列表赋值: >>> a = [1, 2, 3] >>> b = a >>> print ...

  2. python 图像处理与识别书籍_Python图像处理之识别图像中的文字(实例讲解)

    ①安装PIL:pip install Pillow(之前的博客中有写过) ②安装pytesser3:pip install pytesser3 ③安装pytesseract:pip install p ...

  3. python去除图片上的文字_Python图像处理之识别图像中的文字(实例讲解)

    ①安装PIL:pip install Pillow(之前的博客中有写过) ②安装pytesser3:pip install pytesser3 ③安装pytesseract:pip install p ...

  4. python中locals函数_Python神奇的内置函数locals的实例讲解

    摘要 本文我们介绍神奇的locals函数,包括动态创建变量和动态访问变量,以及一个应用场景. 相同属性不相邻问题 需求:有两个list,分别为list1和list2.list1中有n个对象,每个对象有 ...

  5. python爬取房源数据_python爬取安居客二手房网站数据(实例讲解)

    是小打小闹 哈哈,现在开始正式进行爬虫书写首先,需要分析一下要爬取的网站的结构:作为一名河南的学生,那就看看郑州的二手房信息吧! 在上面这个页面中,我们可以看到一条条的房源信息,从中我们发现了什么,发 ...

  6. 【Python基础】手把手教你数据可视化!(附实例讲解)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:CrescentAI,华南理工大学,Datawhale优秀学 ...

  7. python getopt使用_Python命令行参数解析模块getopt使用实例

    这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参考下 格式 getopt(args, options ...

  8. python脚本例子_python dict 字典 以及 赋值 引用的一些实例(详解)

    最近在做一个很大的数据库方面的东东,要用到根据数值来查找,于是想到了python中的字典,平时没用过dict这个东东 用的最多的还是 list 和 tuple (网上查 用法一大堆) 看了一下创建字典 ...

  9. python sys模块讲解_python模块之sys模块和序列化模块(实例讲解)

    sys模块 sys模块是与python解释器交互的一个接口 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys. ...

最新文章

  1. 搜狗手机输入法php,在线调用搜狗云输入法
  2. 【UIKit】UITableView 1
  3. [笔记] 分频计数(七)
  4. python衍生特征
  5. linux+删除乱码的文件,linux 下删除乱码文件-乾颐堂
  6. 工程打包是什么意思_太生动形象了!500个建筑施工3D动画演示,施工工艺一目了然,零基础工程人也能看懂...
  7. python人工智能原理及其应用_人工智能原理与实践:基于Python语言和TensorFlow
  8. cmake打包ICONV库
  9. 《精通ArcGIS Server 应用与开发》——1.5 ArcGIS 10时态
  10. 双时隙的工作原理_双作用叶片泵工作原理是怎样的?作为8年工程师都没了解这么深...
  11. 解决RichEdit line insertion error的方法(转载)
  12. linux环境安装jdk啊
  13. Jsvm2 与 prototype.js 组合 應用心得
  14. SMCJ6.0CA TVS二极管应用领域(瞬态抑制二极管)
  15. 方维P2P短信接口修改
  16. CF gym Coins(01背包计数)
  17. Gearman中文手册技术文档分享chm
  18. 云计算供应商在合同谈判时可能拒绝的三个事项以及要求
  19. 手机连接服务器数据库文件,手机连接服务器数据库文件在哪里
  20. [论文学习] - 2014ECCV - TCDCN

热门文章

  1. json api_JSON模式在构建和部署API中的作用
  2. libgdx和unity_libgdx和Kotlin –类[2D平台原型]
  3. jcg q8 固件_JCG学院开设了Java设计模式课程!
  4. war3必须安装的游戏组件_在单独的WAR组件中对SPA资源和API实现进行分区
  5. java 8 集合分组_Java 8:按集合分组
  6. java奥运会安排赛程问题_记录奥运-当今五大Java记录框架之间的竞赛
  7. 根据谁创建资源授权资源
  8. Java命令行界面(第23部分):Rop
  9. 使用Spring Cloud Config作为外部化配置
  10. junit 经典示例_JUnit4参数化和理论示例