使用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编码时应该注意的几个情况
Mar 04 Python
python执行外部程序的常用方法小结
Mar 21 Python
Python聚类算法之DBSACN实例分析
Nov 20 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
numpy中的高维数组转置实例
Apr 17 Python
python 日志增量抓取实现方法
Apr 28 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
Python爬取数据保存为Json格式的代码示例
Apr 09 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
Discuz Uchome ajaxpost小技巧
2011/01/04 PHP
PHP文件读写操作相关函数总结
2014/11/18 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
基于layui的table插件进行复选框联动功能的实现方法
2019/09/19 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
[02:08]我的刀塔不可能这么可爱 胡晓桃_1
2014/06/20 DOTA
python回调函数中使用多线程的方法
2017/12/25 Python
解决python3 网络请求路径包含中文的问题
2018/05/10 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
详解Python字符串切片
2019/05/20 Python
Python自动抢红包教程详解
2019/06/11 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
python实现同一局域网下传输图片
2020/03/20 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
采用怎样的方法保证数据的完整性
2013/12/02 面试题
.net工程师笔试题
2012/06/09 面试题
颁奖典礼主持词
2014/03/25 职场文书
项目负责人任命书
2014/06/04 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers