python用两种方法实现url短连接

几乎所有的微薄都提供了缩短网址的服务,其原理就是将一个url地址按照一定的算法生成一段字符串,然后加在一个短域名后面边成了一个新的url地址,数据库中会存放这个短地址和原始的地址,当用户点击这个新的短地址后,短地址服务会根据短域名后面的几个字符串从数据库中读出原来的地址然后页面进行跳转 。

比如新浪微薄中的url 是 http://t.cn/xxxxxxx  t.cn是其域名 ,其后面跟着的是7位算出来的字符串。

今天我们用python使用两种方法来实现这个功能。

方法一:使用哈希库自定义算法

因为文本中显示太长的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://pythontab.com')

方法二:使用libsurl库

libsurl 是一个用来生成短URL的C和Python库,支持 bit.ly 和 tinyurl 等短url 服务网站。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索字符串
, url
, 方法
, 地址
, 生成
, 短连接
, 一个
, 短网址算法
, hashlib模块
短地址服务
实现多线程的两种方法、实现线程的两种方法、线程实现的两种方式、实现多线程的两种方式、aop两种实现机制,以便于您获取更多的相关知识。

时间: 2025-01-31 05:58:37

python用两种方法实现url短连接的相关文章

python实现中文输出的两种方法

  这篇文章主要介绍了python实现中文输出的两种方法,实例分析了Python操作中文输出的技巧,需要的朋友可以参考下 方法一: 用encode和decode 如: ? 1 2 3 4 5 6 7 8 9 10 11 import os.path import xlrd,sys Filename='/home/tom/Desktop/1234.xls' if not os.path.isfile(Filename): raise NameError,"%s is not a valid fil

jquery获取URL中参数解决中文乱码问题的两种方法

 从A页面通过url传参到B页面时,获取URL中参数出现中文乱码问题,解析url参数的正确方法如下,感兴趣的朋友可以参考下 从A页面通过url传参到B页面时,解析url参数可以用下面两种方法:  方法一:正则分析法  代码如下: function getQueryString(name) {  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");  var

js判断url是否有效的两种方法

本篇文章主要是对js判断url是否有效的两种方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一:(仅适用于ie)    代码如下: function CheckStatus(url)         {             XMLHTTP = new ActiveXObject("Microsoft.XMLHTTP")             XMLHTTP.open("HEAD",url,false)             XMLHT

JavaScript重定向URL参数的两种方法小结_javascript技巧

这篇文章主要介绍的是JavaScript重定向URL参数的两种方法,下面话不多说,直接看示例代码. 一.字符拼接形式 function setUri(para, val) { var strNewUrl = new String(); var strUrl = new String(); var url = window.location.href; strUrl = window.location.href; if (strUrl.indexOf("?") != -1) { strU

jquery获取URL中参数解决中文乱码问题的两种方法_javascript技巧

从A页面通过url传参到B页面时,解析url参数可以用下面两种方法: 方法一:正则分析法 复制代码 代码如下: function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); if (r != nu

使用JavaScript获取URL中的参数(两种方法)_javascript技巧

本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = request("type") function request() { var query = location.search; var paras = arguments[0]; if (arguments.length == 2) { query = arguments[1]; }

Python中文件遍历的两种方法_python

关于Python的文件遍历,大概有两种方法,一种是较为便利的os.walk(),还有一种是利用os.listdir()递归遍历. 方法一:利用os.walk os.walk可以自顶向下或者自底向上遍历整个文件树,然后返回一个含有3个元素的tuple,(dirpath, dirnames, filenames),要注意的是,os.walk()会返回一个generater,所以调用的时候一定要放到for循环中. 复制代码 代码如下: import osdef walk_dir(dirname): f

实例分析J2ME网络编程的两种方法

编程|网络 本文描述了在J2me中开发主要使用的网络连接方法,分别详细介绍了使用http和socket两种方法. HttpConnection 首先我们先来看一个简单的例子吧: 主要用到的java包: javax.microedition.io.*; public String requestGET(String URLString,String URL) throws IOException{ // ===============================================

两种方法测试spring中的jdbc

两种方法测试spring中的jdbc  JDBC是一个非常基础的数据存取API,spring对其进行简单的封装,  下面以sqlserver中自带的pubs数据库Authors表进行测试.   1):编写Authors.java,其每个对象对应于数据库中的一条记录   package jdbc;public class Authors {   String  lname=null;   String fname=null;   String phone=null;   String addres