使用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解析文件示例
Jan 23 Python
解决Python传递中文参数的问题
Aug 04 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
python实现随机漫步算法
Aug 27 Python
python可视化实现代码
Jan 15 Python
Python3实现从排序数组中删除重复项算法分析
Apr 03 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
php UBB 解析实现代码
2011/11/27 PHP
php短址转换实现方法
2015/02/25 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
vue自定义正在加载动画的例子
2019/11/14 Javascript
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
python实现词法分析器
2019/01/31 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
通俗讲解python 装饰器
2020/09/07 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
护理自荐信范文
2013/10/05 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
高中语文课后反思
2014/04/27 职场文书
初中教师业务学习材料
2014/05/12 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
关于运动会的广播稿
2014/09/22 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
2015年党员承诺书
2015/01/21 职场文书
谢师宴家长致辞
2015/07/27 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书