How do you design URL shortener service?
public class UrlShortener { private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private static final int BASE = ALPHABET.length(); public static String encode(int num) { StringBuilder sb = new StringBuilder(); while ( num > 0 ) { sb.append( ALPHABET.charAt( num % BASE ) ); num /= BASE; } return sb.reverse().toString(); } public static int decode(String str) { int num = 0; for ( int i = 0, len = str.length(); i < len; i++ ) { num = num * BASE + ALPHABET.indexOf( str.charAt(i) ); } return num; } }
算法原理
算法一
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
这种算法,虽然会生成4个,但是仍然存在重复几率.
算法二
a-zA-Z0-9 这64位取6位组合,可产生500多亿个组合数量.把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
具体参看这里彻底完善新浪微博接口和超短URL算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,就有很大问题,特别是对域名相关的统计,就抓瞎了.
一个简单的python生成短链接的方法:
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, 1): n = int(hex[i*8:(i+1)*8], 16) v = [] e = 0 for j in xrange(0, 8): 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[0] if __name__ == '__main__': print get_hash_key('http://www.a2asdfasdfasfdbc.com')
References:
http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener
http://n00tc0d3r.blogspot.com/2013/09/big-data-tinyurl.html
http://iteye.blog.163.com/blog/static/1863080962012111223141936/
相关推荐
Premium URL Shortener是一个专业的网址缩略的脚本代码。其主要功能有:完整的后台管理、功能齐全的用户面板、用户系统、社交分享、短网址统计、顶点网短网址自定义、多国语言支持、社交分享以及API系统等。默认英语...
Who has time to create a backend for a URL shortener? Why not leverage one that already exists, such as TinyUrl. The only problem is, a lot of times, you probably want to allow for deep links into ...
在给定的压缩包"Simple URL Shortener App in Python Free Source Code.zip"中,我们有一个简单的URL缩短器应用程序的源代码。URL缩短器是一种服务,它将长的、复杂的URL转换为简短的、易于记忆的链接,通常用于社交...
构建URL Shortener微服务 :keycap_1: 用户可以将URL张贴到[project_url] / api / shorturl / new,它将在JSON响应中收到缩短的URL。 Example : {"original_url":"www.google.com","short_url":1} :keycap_2: 如果...
您可以在购买Premium URL Shortener。发现了问题? 如果您发现主脚本有问题,请打开“问题”,我们将尽快解决。帮助贡献向我们发送拉取请求,并帮助改进代码。高级URL缩短器PHP API包装器的官方API包装器您的第一次...
在`shortener/urls.py`中定义应用的URL模式,然后在项目的`urls.py`中包含这个应用的URL配置。例如: ```python # shortener/urls.py from django.urls import path from . import views urlpatterns = [ path('...
flask-tinyurl-shortener-flata 使用由Flata支持的Python Flask的URL Shortener,这是一个Python JSON格式的面向文档的数据库。环境变量'APP_STORAGE_FILE' => defaults to: '/tmp/db.json''APP_BASEURL' => ...
A URL Shortener created using Cloudflare worker Url-Shorten-Worker A URL Shortener created using Cloudflare Worker Getting start 去Workers KV中创建一个命名空间 Go to Workers KV and create a ...
premium-url-shortener中文汉化语言包 安装方式,ch.php文件上传至包括/语言下,然后登录管理员后台设置选择为串行语言即可不提供任何本程序源码,仅提供汉化包本汉化由masuc.cn提供,汉化程度95%左右 无偿提供如果...
Premium URL Shortener是一个专业的网址缩略的脚本代码。其主要功能有:完整的后台管理、功能齐全的用户面板、用户系统、社交分享、短网址统计、顶点网短网址自定义、多国语言支持、社交分享以及API系统等。 默认...
【Upto.Site URL Shortener-crx插件】是一款专为英文用户设计的浏览器扩展程序,其主要功能是帮助用户快速生成免费的短网址。这款插件利用了Upto.Site提供的公共API,使得用户在浏览器环境下就能便捷地进行网址缩短...
Premium URL Shortener是一个专业的网址缩略的脚本代码。其主要功能有:完整的后台管理、 功能齐全的用户面板、用户系统、社交分享、短网址统计、顶点网短网址自定义、多国语言支持、 社交分享以及API系统等。默认...
short_code = shortener.shorten_url(long_url) return {"short_code": short_code} @app.route('/<short_code>') def expand_url(short_code): try: expanded_url = shortener.expand_url(short_code) return...
关于该项目欢迎使用URL简化程序Web应用程序该存储库是一个旨在以Web应用程序形式实现URL缩短服务的项目。 语言:Python,HTML,CSS,Bootstrap。如何贡献为资料库加注星标叉它在本地系统中克隆分叉的存储库添加上游...
缩短长网址Google URL Shortener API 允许您像在 goo.gl 上一样缩短 URL 这是一个示例 Meteor 代码,您可以使用它来缩短 url。 Meteor.call("shortenUrl", "http://www.asveloper.com", function(error, result){ if...
在本文中,我们将深入探讨如何使用Laravel框架开发一个URL短化器,即"URL-shortener"项目。Laravel是一个优雅、简洁的PHP框架,它为开发者提供了丰富的工具和功能,便于快速构建高质量的Web应用。"url-shortener"是...
API项目:用于FreeCodeCamp的URL Shortener Microservice用户故事我可以将URL发布到[project_url]/api/shorturl/new然后在JSON响应中收到一个缩短的URL。 范例: {"original_url":"www.google.com","short_url":1} ...
功能★轻松缩短任何链接★通过日期或点击设置链接过期(仅T.LY)★添加您自己的T.LY api密钥★添加您自己的Bit.ly api密钥★通过Rebrandly API使用您自己的自定义域名★自动将URL复制到剪贴板★右键单击以缩短URL并...