使用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/ironpython:从入门到精通
Oct 02 Python
python的即时标记项目练习笔记
Sep 18 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python的迭代器和生成器
Jul 29 Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 Python
使用Python的turtle模块画图的方法
Nov 15 Python
python最长回文串算法
Jun 04 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
Python爬虫学习之翻译小程序
Jul 30 Python
django 读取图片到页面实例
Mar 27 Python
详解Python yaml模块
Sep 23 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中动态HTML的输出技术
2006/10/09 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
在父页面得到zTree已选中的节点的方法
2015/02/12 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
彻底弄懂 JavaScript 执行机制
2018/10/23 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
python 从远程服务器下载东西的代码
2013/02/10 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
在python 中实现运行多条shell命令
2019/01/07 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
使用Python的turtle模块画国旗
2019/09/24 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
共产党员公开承诺书范文
2014/03/28 职场文书
七夕情人节促销方案
2014/06/07 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
2016年元旦寄语
2015/08/17 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书