使用Python生成url短链接的方法
作者:goldensun 发布时间:2021-05-05 02:55:12
标签:Python
几乎所有的微薄都提供了缩短网址的服务,其原理就是将一个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 服务网站。


猜你喜欢
- 先上两段代码<script>var i = 2;function test(){var i = 1;}test();alert(
- 与抓取预定义好的页面集合不同,抓取一个网站的所有内链会带来一个 挑战,即你不知道会获得什么。好在有几种基本的方法可以识别页面类型。通过URL
- 阅读上一篇:css基础教程属性篇 本篇主要介绍css对边框(border)的属性控制和链接(link)的伪类选择器.边框(border):
- 一、Jupyter Notebook是什么?1.notebook jupyter简介Jupyter Notebook是一个开源Web应用程序
- 问题描述有些小伙伴在使用python做GUI界面的时候可能想添加这么一个小功能,就是在界面的某个角落动态的显示当前的时间,本文将介绍具体方法
- 菜单栏,tools--去掉勾选的Vim Emulator这个仿真插件就好了。来源:https://blog.csdn.net/weixin_
- (一)行号显示和排序 1.SQL Server的行号 A.SQL 2000使用identity(int,1,1)和临时表,可以显示行号 SE
- 废话少说,先上代码File:logger.conf[formatters]keys=default[formatter_default]fo
- 学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!这里就简单讨论下python的几种装饰模
- 一对多(ForeignKey)class ForeignKey(ForeignObject): def __init__(sel
- A Process Control System 使用b/s架构、运行在类Unix系统上一个进程监控管理系统它可以使进程以daemon方式运
- 目录一、MySQL数据备份1.1、 mysqldump命令备份数据1.2、 mysqldump常用操作示例1.3、 还原mysql备份内容二
- 直接使用Python来实现向量的相加# -*-coding:utf-8-*-#向量相加def pythonsum(n): a = range
- 方法方法能给用户自定义的类型添加新的行为。它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接
- 我们知道,在js中,当object作为参数传递到函数中进行处理后,实际上是修改了传入的对象本身(或者说是对象的引用),但很多时候我们并不希望
- 解析来自各种来源和格式的时间序列信息pd.to_datetime( arg,#int, float, str, d
- 关于使用CTE(公用表表达式)的递归查询----SQL Server 2005及以上版本公用表表达式 (CTE) 具有一个重要的优点,那就是
- super()函数可以用于继承父类的方法,语法如下:super(type[, object-or-type])虽然super()函数的使用比
- 使用“发送测试电子邮件”对话框来测试使用特定配置文件发送邮件的能力。过程发送测试电子邮件1.使用对象
- testify在团队里推行单元测试的时候,有一个反对的意见是:写单元测试耗时太多。且不论这个意见对错,单元测试确实不应该太费时间。这时候,一