使用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实现获取照片拍摄日期并重命名的方法
Sep 30 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
pandas Dataframe行列读取的实例
Jun 08 Python
python如何生成各种随机分布图
Aug 27 Python
Django restframework 源码分析之认证详解
Feb 22 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
python编写简单端口扫描器
Sep 04 Python
Python如何读取文件中图片格式
Jan 13 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 Python
PyQt 如何创建自定义QWidget
Mar 24 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
第三节 定义一个类 [3]
2006/10/09 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
php获取远程文件大小
2015/10/20 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
PHP的PDO连接讲解
2019/01/24 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
Bootstrap fileinput文件上传预览插件使用详解
2017/05/16 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
javascript自定义右键菜单插件
2019/12/16 Javascript
javascript实现滚轮轮播图片
2020/12/13 Javascript
python迭代器的使用方法实例
2013/11/21 Python
Python实现单词拼写检查
2015/04/25 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
浅析python 字典嵌套
2020/09/29 Python
Django Form常用功能及代码示例
2020/10/13 Python
师范生自荐信
2013/10/27 职场文书
个人评价范文分享
2014/01/11 职场文书
小学毕业感言300字
2014/02/19 职场文书
共产党员公开承诺书
2014/03/25 职场文书
学生会副主席竞聘书
2014/03/31 职场文书
老干部工作汇报材料
2014/10/28 职场文书
团员个人总结
2015/02/26 职场文书
家长意见书
2015/06/04 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle