使用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中用memcached来减少数据库查询次数的教程
Apr 07 Python
Python机器学习之SVM支持向量机
Dec 27 Python
python逆序打印各位数字的方法
Jun 25 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
Python函数返回不定数量的值方法
Jan 22 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
对Python3中列表乘以某一个数的示例详解
Jul 20 Python
Django文件存储 默认存储系统解析
Aug 02 Python
Python FFT合成波形的实例
Dec 04 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 Python
Python通过len函数返回对象长度
Oct 22 Python
Python 视频画质增强
Apr 28 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与C#分别格式化文件大小的代码
2011/05/14 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
django主动抛出403异常的方法详解
2019/01/04 Python
python适合人工智能的理由和优势
2019/06/28 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
python实现随机加减法生成器
2020/02/24 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
菲律宾票务网站:StubHub菲律宾
2018/04/21 全球购物
排序都有哪几种方法?请列举。用JAVA实现一个快速排序
2014/02/16 面试题
应届毕业生求职信范文
2013/12/18 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
小小的船教学反思
2014/02/21 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
工作求职信
2014/07/04 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
JS Object构造函数之Object.freeze
2021/04/28 Javascript
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang