使用Python生成url短链接的方法


Posted in Python onMay 04, 2015

几乎所有的微薄都提供了缩短网址的服务,其原理就是将一个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 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 
      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 服务网站。

Python 相关文章推荐
分析在Python中何种情况下需要使用断言
Apr 01 Python
在Python程序中进行文件读取和写入操作的教程
Apr 28 Python
Python自动发邮件脚本
Mar 31 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python pytest进阶之xunit fixture详解
Jun 27 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
python实现贪吃蛇游戏源码
Mar 21 Python
解决windows下python3使用multiprocessing.Pool出现的问题
Apr 08 Python
Pytorch数据拼接与拆分操作实现图解
Apr 30 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
python中pyqtgraph知识点总结
Jan 26 Python
python实现bucket排序算法实例分析
May 04 #Python
python在指定目录下查找gif文件的方法
May 04 #Python
python创建关联数组(字典)的方法
May 04 #Python
python对html代码进行escape编码的方法
May 04 #Python
python访问类中docstring注释的实现方法
May 04 #Python
Python编写生成验证码的脚本的教程
May 04 #Python
使用Python制作获取网站目录的图形化程序
May 04 #Python
You might like
比较完整的微信开发php代码
2016/08/02 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
利用jquery操作Radio方法小结
2014/10/20 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
VUE 使用中踩过的坑
2018/02/08 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
django 多数据库配置教程
2018/05/30 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
使用Matplotlib 绘制精美的数学图形例子
2019/12/13 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
大一学生的职业生涯规划书范文
2014/01/19 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
高中团支书竞选稿
2015/11/21 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
基于Go语言构建RESTful API服务
2021/07/25 Golang