使用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错误处理详解
Sep 28 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
python turtle库画一个方格和圆实例
Jun 27 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
对Django外键关系的描述
Jul 26 Python
在Tensorflow中查看权重的实现
Jan 24 Python
Python3 集合set入门基础
Feb 10 Python
python导入库的具体方法
Jun 18 Python
Python在字符串中处理html和xml的方法
Jul 31 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中simplexml_load_file函数用法实例
2014/11/12 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
2017/08/10 PHP
event.srcElement+表格应用
2006/08/29 Javascript
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
python字典操作实例详解
2017/11/16 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
python 实现客户端与服务端的通信
2020/12/23 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
地道战观后感500字
2015/06/04 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
使用feign服务调用添加Header参数
2021/06/23 Java/Android
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python