使用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实现在pickling的时候压缩的方法
Sep 25 Python
Python中的多重装饰器
Apr 11 Python
python检测是文件还是目录的方法
Jul 03 Python
基于Python闭包及其作用域详解
Aug 28 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
python使用opencv按一定间隔截取视频帧
Mar 06 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Python中Unittest框架的具体使用
Aug 27 Python
python 魔法函数实例及解析
Sep 25 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
Python基础之条件语句详解
Jun 16 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
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
详解webpack的配置文件entry与output
2017/08/21 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
Python制作简单的网页爬虫
2015/11/22 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
解决方案设计综合面试题
2015/08/31 面试题
高中班主任评语大全
2014/04/25 职场文书
讲文明树新风演讲稿
2014/05/12 职场文书
企业宣传策划方案
2014/05/29 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Python异常类型以及处理方法汇总
2021/06/05 Python
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL