使用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中with及contextlib的用法详解
Jun 08 Python
使用python实现ANN
Dec 20 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
python 把文件中的每一行以数组的元素放入数组中的方法
Apr 29 Python
python通过zabbix api获取主机
Sep 17 Python
django中账号密码验证登陆功能的实现方法
Jul 15 Python
django删除表重建的实现方法
Aug 28 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
Python JSON编解码方式原理详解
Jan 20 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
python 高阶函数简单介绍
Feb 19 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 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
完美解决dedecms中的[html][/html]和[code][/code]问题
2007/03/20 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
使用vue 国际化i18n 实现多实现语言切换功能
2018/10/11 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
Python获取服务器信息的最简单实现方法
2015/03/05 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
python 字典中取值的两种方法小结
2018/08/02 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
python获取引用对象的个数方式
2019/12/20 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
python实现井字棋小游戏
2020/03/04 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
公司年会演讲稿范文
2014/01/11 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
辞职信怎么写?
2019/05/21 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android