使用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中的map、reduce和filter浅析
Apr 26 Python
Python实现线程池代码分享
Jun 21 Python
Python中字符串的常见操作技巧总结
Jul 28 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
Oct 11 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
Python中将两个或多个list合成一个list的方法小结
May 12 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
如何基于Python按行合并两个txt
Nov 03 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
Nov 28 Python
Django操作cookie的实现
May 26 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完整的日历类(CLASS)
2006/11/27 PHP
php strcmp使用说明
2010/04/22 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
DOM事件探秘篇
2017/02/15 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
在vue-cli项目中使用bootstrap的方法示例
2018/04/21 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
django1.8使用表单上传文件的实现方法
2016/11/04 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
python实现图像拼接功能
2020/03/23 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
365 Tickets英国:全球景点门票
2019/07/06 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
应届生财务会计求职信
2013/11/05 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
公司任命书模板
2014/06/06 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
小学领导班子对照材料
2014/08/23 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
初一年级组工作总结
2015/08/12 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python