使用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脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
python pyheatmap包绘制热力图
Nov 09 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
Python 实现子类获取父类的类成员方法
Jan 11 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
django下创建多个app并设置urls方法
Aug 02 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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
smarty section简介与用法分析
2008/10/03 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
2020/05/02 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
JavaScript判断undefined类型的正确方法
2015/06/30 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
JavaScript兼容性总结之获取非行间样式案例
2016/08/07 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
JS面向对象之单选框实现
2020/01/17 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
Python break语句详解
2014/03/11 Python
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
python实现图像外边界跟踪操作
2020/07/13 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
建筑工地宣传标语
2014/06/18 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
中国合伙人观后感
2015/06/02 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书